【问题标题】:how iterate through child element of multiple parents xml file c#如何遍历多个父xml文件c#的子元素
【发布时间】:2014-01-09 16:52:27
【问题描述】:

我有一个这样的 xml 文件:

<post>
   <categories>
        <category ref="4527" />
        <category ref="4528" />
        <category ref="4529" />
        <category ref="4530" />
        <category ref="4531" />
   </categories>
</post>
<post>
   <categories>
        <category ref="4523" />
        <category ref="4524" />
        <category ref="4525" />
        <category ref="4526" />
        <category ref="4527" />
   </categories>
</post>

使用 C# 和 .Net 4.5 我想获取第一组类别参考编号,然后处理它们,然后移动到下一组类别参考编号并处理它们。我希望有人能指出我正确的方向。我不确定如何使用 XPath 或 Linq to XML 执行此操作,或者这些方法是否正确。提前致谢。

在回复了一些非常聪明的人之后,我能够使用 Selman22 的思路来帮助我编写一些 XPath。这是我想出的解决方案:

XmlDocument xdoc = new XmlDocument;
xdoc.Load(savePath);
XmlNode root = xdoc.DocumentElement;
// add the namespace 
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
nsmgr.AddNamespace("bml", "http://www.blogml.com/2006/09/BlogML");
//puts the catagories elements into a list
XmlNodeList blogCatagories = root.SelectNodes("descendant::bml:post/bml:categories", nsmgr);
//loop throught list and place the attribute "ref" into a list and traverse each "ref"
foreach (XmlNode nodeCat in blogCatagories)
{
     XmlNodeList catagoryids = nodeCat.SelectNodes("descendant::bml:category/@ref", nsmgr);
    foreach (XmlNode nodeID in catagoryids)
    {
        Console.WriteLine(nodeID.InnerText.ToString());

    }
}

【问题讨论】:

标签: c# .net xml xpath linq-to-xml


【解决方案1】:

首先获取您的categories

var xdDoc = XDocument.Load(path);
var categories = xDoc.Descendants("categories").ToList();

然后遍历您的类别列表

foreach(var cat in categories)
{
  var numbers = cat.Elements("category").Select(c => (int)c.Attribute("ref"));

  foreach(var number in numbers)
  {
     // process your numbers

  }
}

【讨论】:

  • 感谢 Selman22 的意见。我无法实现您的方法,但我能够使用您的思维过程并编写一些 xpath。我将代码添加到我的原始帖子中。
【解决方案2】:
var xdoc = XDocument.Load(path_to_xml);
var query = from p in xdoc.Root.Descendants("post")
            select p.Element("categories")
                    .Elements("category")
                    .Select(c => (int)c.Attribute("ref"))
                    .ToList();

此查询将返回迭代器,每次迭代时都会获取下一个类别参考编号序列。

foreach(List<int> references in query)
{
   // process list of references
   foreach(int reference in references)
      // process reference
}

【讨论】:

    【解决方案3】:
    XPathNavigator xml = new XPathDocument(filename).CreateNavigator();
    foreach(XPathNavigator categories in xml.Select("//categories"))
    {
        foreach(XPathNavigator category in categories.Select("category"))
        {
            string category_ref = category.GetAttribute("ref", string.Empty);
        }
        // do processing
    }
    

    【讨论】:

      【解决方案4】:

      在回复了一些非常聪明的人之后,我能够使用 Selman22 的思路来帮助我编写一些 XPath。

      XmlDocument xdoc = new XmlDocument;
      xdoc.Load(savePath);
      XmlNode root = xdoc.DocumentElement;
      // add the namespace
      XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
      nsmgr.AddNamespace("bml", "http://www.blogml.com/2006/09/BlogML");
      //puts the catagories elements into a list
      XmlNodeList blogCatagories = root.SelectNodes("descendant::bml:post/bml:categories", nsmgr);
      //loop throught list and place the attribute "ref" into a list and traverse each "ref"
      foreach (XmlNode nodeCat in blogCatagories)
      {
          XmlNodeList catagoryids = nodeCat.SelectNodes("descendant::bml:category/@ref", nsmgr);
          foreach (XmlNode nodeID in catagoryids)
          {
              Console.WriteLine(nodeID.InnerText.ToString());
      
          }
      }
      

      【讨论】:

        【解决方案5】:

        我会使用 XPathDocument 和 XPathNavigator,google 上有很多这样的例子

        http://www.codegod.com/XPathDocument-XPathNavigator-XPathNodeIterator-sample-with-C-AID504.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多