期待どおりに動作しないXElement.Descendants(「ノード」)は、子孫の複数のレベルを返します
質問
私は問題を持っています。
:私は、次のような階層的な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>
そして、私は(バラの下)赤、ピンク、白なしだけの花(バラ、チューリップ、どのような)を取得する必要があります 私は、次のコードを使用していますが、原因のすべてのノードがあるという事実のために、「ノードが」私は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のクエリは、私が必要とする唯一のノードの枝を盗んことができますが、研究とテストの多くの後、私は答えを見つけることができませんでした...(私のXMLは、SQL 2008でのXML列です)
解決
我々はこれを持っているので...
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のにダイビングを取ることにした、私はそれが悪くはなかったと思います。それはそれが必要とするだけの方法を動作しない場合は、少なくともそれがスタートだ。
所属していません StackOverflow