C# 基于节点深度查询XDocument

C# 基于节点深度查询XDocument,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有以下XML,我希望能够根据XML的深度查询XML。我知道眼前的深度 更新问题: 我有以下XML,我希望能够根据节点是否重复来查询XML 这是我的XML <Books> <BookID>12345</BookID> <BookName>BookName</BookName> <Authors> <Author> <Name>AuthorNameOne</Name

我有以下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>

12345
书名
阿索那莫内
纽约
作者姓名二
纽约
通过XDocument,我希望能够查询此XML,并获取存在重复数据(如作者)的元素的节点名。或者,我希望能够根据节点的深度进行查询

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


任何帮助都将不胜感激。

您的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);
      }
 }

该算法将查看xml树中的每个节点,然后从当前节点的父节点开始计算存在多少同名节点。如果这个数字大于1,它将把它添加到重复节点列表中。这并不关心当前节点的深度,它将只统计相同深度的重复命名节点。此外,此算法将在列表结构中放置重复项,但您可以添加自己的逻辑以防止重复,或者使用不允许重复的不同结构。

那么您尝试实现哪一种?“哪里有重复数据”需要更多的信息,“基于节点的深度”也不是很清楚。你说你“事先知道深度”——那么你需要问什么?样本输入和预期输出也会很有用。另外,奇怪的是,XML中有一个
Books
元素,其中有一个
BookID
——我希望中间有一个
Book
元素,就像里面有
Authors
Author
一样。此外,如果您想知道深度,没有完全缩进所有XML也没有帮助,请使其易于目视发现每个元素的深度!正如@JonSkeet所提到的,您的xml结构没有多大意义,但可能只是缩进已关闭。例如,您希望在
Books
节点下找到一个或多个
Book
元素。使用LINQ定位重复的节点很容易,但首先要确保xml结构设置正确。@JonSkeet:谢谢您的回复。我现在更新了我的问题。请看一看。基本上,我希望能够在有多个子元素的情况下检索“Authors”这样的名称。仅仅重复“获取包含重复数据(如Authors)的元素的节点名称”实际上并不能让它变得更清晰。基本上,你已经说过几次同样的不清楚的事情了——看起来这里仍然有两个不同的问题,一个是基于重复数据的问题,另一个是基于节点深度的问题,这两个问题都不清楚。请阅读
var dupes = xml.Descandants().Where(n => n.Parent.Elements(n.Name).Count() > 1);