【问题标题】:Query XDocument based on the depth of the node根据节点深度查询XDocument
【发布时间】:2015-02-26 17:37:10
【问题描述】:

我有以下 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 并获取存在重复数据的元素的节点名称,例如作者。

任何帮助将不胜感激。

【问题讨论】:

  • 那么你想达到哪个目标? “有重复数据的地方”需要很多更多信息——而且“基于节点的深度”也不是很清楚。你说你“事先知道深度” - 那么你需要查询什么?样本输入和预期输出也会很有用。此外,奇怪的是你的 XML 有一个 Books 元素,其中直接有一个 BookID - 我希望在两者之间有一个 Book 元素,就像你有 Authors 和里面的 Author 一样。
  • 另外,您没有完全缩进所有 XML 也无济于事 - 如果您询问深度,请让您轻松直观地发现每个元素的深度!跨度>
  • 正如@JonSkeet 提到的那样,您的 xml 结构没有多大意义,但可能只是缩进已关闭。例如,您希望在Books 节点下找到一个或多个Book 元素。使用 LINQ 定位重复节点很容易,但您要确保首先正确设置 xml 结构。
  • @JonSkeet:感谢您的回复。我现在已经更新了我的问题。请看一看。基本上我希望能够在有多个子元素的情况下检索像“作者”这样的名称。
  • 只是重复“获取具有重复数据的元素的节点名称,例如作者”实际上并不能使其更清晰。基本上你已经多次说了同样不清楚的事情 - 看起来你在这里仍然有两个不同的问题,一个基于重复数据,一个基于节点深度,两个都不清楚 .请阅读tinyurl.com/stack-hints

标签: c# xml linq-to-xml


【解决方案1】:

您的 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&lt;XElement&gt;,其中包含在我的第一个示例中将进入 List 的所有元素:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多