代码之家  ›  专栏  ›  技术社区  ›  Manoj Attal

使用属性节点将LINQ解析为XML

  •  1
  • Manoj Attal  · 技术社区  · 15 年前

    我正在使用具有以下结构的XML

    <ruleDefinition appId="3" customerId = "acf">
        <node alias="element1" id="1" name="department">
            <node alias="element2" id="101" name="mike" />
            <node alias="element2" id="102" name="ricky" />
            <node alias="element2" id="103" name="jim" />
        </node>
    </ruleDefinition>
    

    这里的节点是使用别名区分的,而不是使用节点标记。如您所见,顶级节点元素1与元素2具有相同的节点名称“node”。我想基于属性别名解析这个XML。

    要实现这一点,linq-to-xml代码(使用c)应该是什么?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Anthony Pegram    15 年前

    这是一种将数据结构解析为包含element1字符串属性和IEnumerable element2属性(其中包含多个element2数据)的项的方法。

    string xml = @"<ruleDefinition appId=""3"" customerId = ""acf""> 
        <node alias=""element1"" id=""1"" name=""department"">
            <node alias=""element2"" id=""101"" name=""mike"" /> 
            <node alias=""element2"" id=""102"" name=""ricky"" />
            <node alias=""element2"" id=""103"" name=""jim"" />
        </node>
        </ruleDefinition>";
    
    XDocument document = XDocument.Parse(xml);
    
    var query = from node in document.Descendants("node")
                where node.Attribute("alias").Value == "element1"
                select new
                {
                    Element1 = new
                               {
                                   Id = node.Attribute("id").Value,
                                   Name = node.Attribute("name").Value
                               },
    
                    Element2 = from n in node.Descendants("node")
                               where n.Attribute("alias").Value == "element2"
                               select new
                               {
                                   Id = n.Attribute("id").Value,
                                   Name = n.Attribute("name").Value
                               }
                };
    
    foreach (var item in query)
    {            
        Console.WriteLine("{0}\t{1}", item.Element1.Id, item.Element1.Name);
    
        foreach (var element2 in item.Element2)
            Console.WriteLine("\t{0}\t{1}", element2.Id, element2.Name);
    }
    
        2
  •  1
  •   Matt Dearing    15 年前

    你可以这样做:

    XDocument doc = XDocument.Parse(YourXML);    
    var nodes = doc.Descendants("node").Where(x => x.Attribute("alias").Value == "element1");
    

    它将查找别名属性为element1的所有节点。