0

複数のノードがネストされた XML ドキュメントがあります。その構造は固定されていません。ユーザーから渡された値に基づいて XML をフィルター処理したいと考えています。つまり、全 1000 ノードのうち、5 つのノードに「xyz」で始まる値が含まれている場合、それらの 5 つのノードを取得したいと考えています。

xPathで「LIKK」の種類の演算子が見つからなかったため、これを実現するためにLINQ to XMLを使用しようとしています。LINQ ではどのようなクエリを記述すればよいですか?

これまでのところ、私は以下のようなことをしていました:

        dim FilterString as string  = "abc"
        Dim doc = New XDocument(Linq.XElement.Parse(objXML.DocumentElement.OuterXml))

        Dim query = doc.Elements()
        query = From e In doc.Elements()
                Where e.Value.ToUpper.StartsWith(FilterString.ToUpper)
                Select e
        Dim sb As New StringBuilder
        For Each result In query
            sb.AppendLine(result)
        Next

サンプル XML は次のようになります。

<root>
<node>
<p1>abcxys</p1>
<p2>anc</p2>
<c1>
   <c2>abcggh</c2>
   <c3>123</c3>
</c1>
</node>
</root>

結果として root/node/p1 と root/node/c1/c2 が必要です。これどうやってするの?

4

1 に答える 1

0

それらが任意のノードに存在する可能性がある場合は、すべてのノードにクエリを実行する必要があります。フィルタリングするものは何もありません。これは非常に費用のかかるプロセスになる可能性があります。

string userInput = "abc";

var xDoc = XDocument.Load(@"C:\Test\Xml.xml");
var q = from e in xDoc.Descendants()
             where e.Value.IndexOf(userInput) == 1
             select e;

文字列の最初の部分だけをテストする場合でも、値全体を返し、条件に対して文字列をテストする必要があります。このクエリは、テキスト「abc」が文字列の先頭にあるかどうかを確認し(空の文字列の場合は0を返します)、その条件を必要とする要素のコレクションを返します。

于 2012-11-28T17:08:22.940 に答える