【问题标题】:Get Nodes from XML having same parent and child name从 XML 中获取具有相同父子名称的节点
【发布时间】:2013-11-14 13:46:44
【问题描述】:
    <maintag>
           <CENTER>
              <ID>11</ID>
              <CENTER>333</CENTER>
           </CENTER>
           <PRODUCTID>100</PRODUCTID>
           <LastNum>0900</LastNum>

    </maintag>

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

【问题讨论】:

  • XPath "//CENTER[CENTER]/*" 将 CENTER 标记的所有子标记作为子标记,在本例中为 ID 和 CENTER

标签: c# xml


【解决方案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;


    }

【讨论】:

  • 有时我使用 LINQ XML 其他时间,这似乎更简单。
【解决方案2】:

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

 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?

【讨论】:

    【解决方案3】:

    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 值放入新的结果集合中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多