根据节点的深度查询XDocument

时间:2015-02-26 17:37:10

标签: c# xml linq-to-xml

我有以下XML,我希望能够根据XML的深度查询XML。我事先知道了深度。

更新的问题: 我有以下XML,我希望能够根据节点是否重复来查询XML。

所以,这是我的XML

<Books>
  <BookID>12345</BookID>
  <BookName>BookName</BookName>
  <Authors>
    <Author>
      <Name>AuthorNameOne</Name>
      <City>New York</City>
    </Author>
    <Author>
      <Name>AuthorNameTwo</Name>
      <City>New York</City>
    </Author>
  </Authors>
</Books>

通过XDocument我希望能够查询此XML并获取有重复数据的元素的节点名称,例如作者。或者我希望能够根据节点的深度来查询它。

更新的问题: 通过XDocument,我希望能够查询此XML并获取存在重复数据的元素的节点名称,例如作者。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你的XML仍然没有意义,但我把这个答案放在一起,希望它至少能指出你正确的方向。我将完全忽略引用节点深度的问题部分,因为我不确定它如何应用于您发布的以下问题:

  

通过XDocument我希望能够查询此XML并获取有重复数据的元素的节点名称,例如作者。

这里假设你的XDocument被命名为xml,该如何做这个简单的类型查询:

List<XElement> repeatedNodes = new List<XElement>();
for(XElement node in xml.Descendants())
{
      if(node.Parent.Elements(node.Name).Count() > 1))
      {
           repeatedNodes.Add(node);
      }
 }

这里的相同代码压缩成一个lambda,它将为您提供一个IEnumerable<XElement>,其中包含我在第一个示例中进入List的所有元素:

var dupes = xml.Descandants().Where(n => n.Parent.Elements(n.Name).Count() > 1);

该算法将查看xml树中的每个节点,然后从当前节点的父节点查看存在多少具有相同名称的节点。如果该数字大于1,则会将其添加到重复节点列表中。这并不关心当前节点的深度,它只计算相同深度的重复命名节点。此外,此算法将dupe放在List结构中,但您可以添加自己的逻辑以防止它执行此操作或使用不允许重复的不同结构。