1

次のXMLドキュメントを想像してみてください。

<root>
    <person_data>
        <person>
            <name>John</name>
            <age>35</age>
        </person>
        <person>
            <name>Jim</name>
            <age>50</age>
        </person>
    </person_data>
    <locations>
        <location>
            <name>John</name>
            <country>USA</country>
        </location>
        <location>
            <name>Jim</name>
            <country>Japan</country>
        </location>
    </locations>
</root>

次に、ジムの個人ノードを選択します。

XmlNode personNode = doc.SelectSingleNode("//person[name = 'Jim']");

そして今、単一のXPath選択を持つこのノードから、Jimのロケーションノードを取得したいと思います。何かのようなもの:

XmlNode locationNode = personNode.SelectSingleNode("//location[name = {reference to personNode}/name]");

私はpersonNodeに基づいて選択しているので、selectで参照できれば便利です。これは可能ですか?..そこに接続はありますか?

確かに、コードを数行追加して名前を変数に入れ、これをXPath文字列で使用することはできますが、それは私が求めていることではありません。

4

5 に答える 5

3

これはあまり効率的ではありませんが、うまくいくはずです。ファイルが大きくなるほど、これは遅くなります。

string xpath = "//location[name = //person[name='Jim']/name]";
XmlNode locationNode = doc.SelectSingleNode(xpath);

これが非効率な理由は次のとおりです。

  • " //" 省略形は、すべてのノードのドキュメント全体のスキャンを引き起こします。
  • " " 述語は、 " " に一致する[]それぞれについて 1 回、ループで実行されます。<person>//person
  • 2 番目の " //" は、ドキュメント全体のスキャンを再び引き起こします。今回は、それぞれに対して 1 回です<person>

これは、二次 O(n²) 最悪の場合のパフォーマンスが得られることを意味し、これは悪いことです。<person>ドキュメントに nと nがある場合<location>、nxn ドキュメント全体のスキャンが発生します。無邪気に見える 1 つの XPath 式からすべてが得られます。

私はそのアプローチに反対することをお勧めします。2 段階の選択 (最初に人を見つけ、次に場所を見つける) のほうが効果的です。

于 2009-06-05T14:30:35.810 に答える
1

locationノードに基づいてノードを選択するのではなく、ノードのpersonに基づいてノードを選択しています。値は単なる文字列であり、この場合、("Jim") 内の値に基づいてノードを選択する述語条件を作成するために使用できます。location

于 2009-06-05T14:03:48.407 に答える
1

から場所を参照したい理由がよくわかりませんpersonNode。名前はすでにノードに存在するlocationため、同じ名前を使用して「Jim」に対応する場所ノードを取得できます。

XPath would be: //location[name = 'Jim']
于 2009-06-05T14:08:28.320 に答える
0

あなたの実際のXMLドキュメントはあなたの例よりも複雑であることに感謝しますが、それについて私を驚かせることが1つあります。これは、以下を含むリレーショナルデータストアに似ています。

  • person2つの列を持つテーブル-nameおよびage
  • location2つの列を持つテーブル-nameおよびcountry
  • name2つの列で結合する2つのテーブル間の1-1の関係。

それを念頭に置いて、XPathが明らかになります。データが必要なテーブルの主キー値を選択するだけです。

//location[name = 'Jim']

aJがすでにそのソリューションを提案し、それが拒否されたことは知っていますが、アイデアを実際のXMLスキーマに一般化すると、次のようになります。

//real_2nd_table_name[real_2nd_pk_column_name_1 = real_1st_pk_column_value_1 and real_2nd_pk_column_name_2 = real_1st_pk_column_value_2 and real_2nd_pk_column_name_3 = real_1st_pk_column_value_3 ...]

言い換えると:

  1. 最初のテーブルで行を見つけるために使用されるPK値はすでに知っています。
  2. 2つのテーブルがどのように関連しているかを知っています。
  3. したがって、最初のテーブルの行を選択するために使用したのと同じ値を使用して、2番目のテーブルでPKクエリを表現する方法を理解できるはずです。
于 2010-03-23T13:38:27.610 に答える
0
XmlNode locationNode = personNode.SelectSingleNode(".."); 

それをする必要があります。

于 2009-08-19T13:35:41.190 に答える