XElement.Descendants(“节点”)行为不符合预期,返回后裔的多层次

StackOverflow https://stackoverflow.com/questions/1753518

  •  20-09-2019
  •  | 
  •  

我有一个问题。我有诸如层次化XML数据:

<Tree>
  <Node Text="Stuff" ItemGUID="064a9bf0-0594-47f8-87be-88dd73763c77" >
    <Node Text="Food" ItemGUID="326f1f7a-d364-4838-9bdc-ce5fd93f88ca" ItemType="2" />
    <Node Text="Wines" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
    <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
        <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f">
              <Node Text="Red" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
              <Node Text="Pink" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
              <Node Text="White" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        </Node>
        <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
    </Node>
    <Node Text="Sweet Delights" ItemGUID="1df7dbae-adf0-49a9-aaac-1358468a245b" />
  </Node>
</Tree>

和我需要得到公正鲜花(玫瑰,郁金香,无论),而红,粉,白(下玫瑰)  我使用下面的代码,但由于所有节点都是“节点” I得到Descendats的各个层面。我想将其限制为仅一个级别。

XElement loadedXML = clients.ItemTreeXML;

//filter only current node
XElement procXML;
procXML = new XElement ("Tree",
          from el in loadedXML.Descendants("Node")
          where (string)el.Attribute("ItemGUID") == currentNodeGUID
          select el); 

结果通缉:

<Tree>
        <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4">
            <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
            <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
            <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" />
        </Node>
</Tree>

谢谢,

补充:也许一个SQL查询2008年可能仅retreive节点分支我需要的,但大量的研究和测试后,我无法找到答案......(我的XML是在XML列在SQL 2008)

有帮助吗?

解决方案

因此,我们有这...

XElement loadedXML = XElement.Load("test.xml");

//filter only current node
XElement procXML;
procXML = new XElement("Tree",
    from el in loadedXML.Descendants("Node")
    where (string)el.Attribute("ItemGUID") == currentNodeGUID
    select el);
我发现

最好的办法是你做的LINQ查询后删除所有的子元素。像这样:

foreach (XElement xl in procXML.Element("Node").Elements("Node"))
{
    if (xl.HasElements) // just remove the ones without child elements
    {
        xl.RemoveNodes();
    }
}

这将输出你想要的是什么,但我必须补充...有最肯定一个更好的方式来做到这一点。我不知道这将如何工作与你的情况给出最编写的代码需要比这工作动态等等。

我看到了这个问题,并决定采取潜入LINQ的,我想这是没有那么糟糕。如果不行就用这种方式需要,至少它是一个开始。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top