0

問題があります。次のような階層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>

そして、赤、ピンク、白(バラの下)なしで花(バラ、チューリップ、その他)だけを取得する必要があります。次のコードを使用していますが、すべてのノードが「ノード」であるため、すべてのレベルの子孫を取得します。 。1つのレベルに限定したいと思います。

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列にあります)

4

1 に答える 1

0

だから私たちはこれを持っています...

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に飛び込むことにしました。それほど悪くはなかったと思います。それが必要な方法で機能しない場合は、少なくともそれは始まりです。

于 2009-11-18T05:25:43.913 に答える