从具有相同父名和子名的XML获取节点

时间:2013-11-14 13:46:45

标签: c# xml

    <maintag>
           <CENTER>
              <ID>11</ID>
              <CENTER>333</CENTER>
           </CENTER>
           <PRODUCTID>100</PRODUCTID>
           <LastNum>0900</LastNum>

    </maintag>

我有上面的XML,其中父项和它的一个子节点(即CENTER)有相同的标记名称。我知道我可以在主标签的索引0处的多个步骤中解析它,然后CENTER标签的索引0将给出ID并且中心标签的索引1将给出中心等的值333但是有没有办法可以直接获得ID和CENTER(11,333)的值直接。

3 个答案:

答案 0 :(得分:1)

class Program
  {
    static void Main(string[] args)
    {
      string xml = @"<maintag>
           <CENTER>
              <ID>11</ID>
              <CENTER>333</CENTER>
           </CENTER>
           <PRODUCTID>100</PRODUCTID>
           <LastNum>0900</LastNum>
    </maintag>";

      XmlDocument xd = new XmlDocument();
      xd.LoadXml(xml);

      string center = xd.DocumentElement.SelectSingleNode("CENTER/CENTER").InnerText;
      string id = xd.DocumentElement.SelectSingleNode("CENTER/ID").InnerText;


    }

答案 1 :(得分:0)

我在这里给你一个非常一般的答案:

 var elementsWithChildrenOfSameName = 
    xmlDoc.Root.Elements()
     .Where(ele => ele.Elements().Any(t => t.Name == ele.Name)).ToList();

从那里,您可以轻松获得所需的数据。

或者采用集成查询样式:

 var elementsWithChildrenOfSameName = 
        from parent in xmlDoc.Root.Elements()
        from child in parent.Elements()
        where child.Name == parent.Name
        select parent; // Or maybe select the id's?

答案 2 :(得分:0)

LinqToXml XDocument查询:

XDocument doc = XDocument.Parse(x);
var res = doc.Descendants("CENTER")
             .Where(el => el.Elements("ID").Count() > 0 && el.Elements("CENTER").Count() > 0)
             .Select(el => new { 
                                 id = el.Element("ID").Value,
                                 center = el.Element("CENTER").Value 
                               })
             .ToList();

选择所有CENTER标签,其中包含ID和CENTER标签,并将其ID和CENTER值带入新的结果集合。