2011-06-21 3 views
1

私はCSharp、XPath、およびHTMLAgility Packを使用しています。私は以下のようなXPath文字列を使用します:XPath OR、代替

"//table[3]/td[1]/span[2]/text() | //table[6]/td[1]/span[2]/text()" 
"//table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text()" 

違いはテーブル番号だけです。他のXPath関数を使用してXPathまたは|を置き換えることはできますか?

実際に行ったこと:最初のXPath文字列(ここではテーブル番号3 & 6)を使用して1つの値を抽出します。 2番目のXPath文字列(テーブル番号は8 &です)では、別の値を抽出します。

パフォーマンスに関するその他の質問 - XPath文字列//table[8]/td[1]/span[2]/text()はXPath文字列よりも速く、OR//table[8]/td[1]/span[2]/text() | //table[10]/td[1]/span[2]/text()?私はこれに尋ねます。なぜなら、多くの多くの値に対して多くのXPath文字列があり、実際には何か他のものを試す必要があるという違いがあるからです。私はあなたの経験を分かち合うためにこの質問をあなたに依頼しています。

+0

全体または?の代わりに[3 | 6]を使用するだけではどうですか? –

+0

@Yet:その場合でも有効なXPathではありません。任意の式だけでなく、2つのノードセット間でORを使用できます。 –

+0

Htmlで許可されている場合は、他のXPATH式を使用できます。いくつかのHTMLコードを共有できますか? –

答えて

3

まず、//table[6]が奇妙に見えます。 (//table)[6]を意味するものではありませんか? (最初はその親の6番目の子であるすべてのテーブルを選択し、2番目のテーブルはその文書の6番目のテーブルを選択します)。

あなたはおよそ

((//table)[3] | (//table)[6] | (//table)[8] | (//table)[10])/td[1]/span[2]/text() 

あなたの質問を書くことができ(いずれかのリリースでは)

(//table)[position()=3 or position()=6 or position()=8 or position()=10] 
    /td[1]/span[2]/text() 

かでなければならないであろう1.0で

(//table)[position()=(3,6,8,10)]/td[1]/span[2]/text() 

を書くことができたXPath 2.0では

使用しているXPathの実装を知らなければ、パフォーマンスには答えられません。

+0

すべてのお返事ありがとうございます。私が使っているXPathのバージョンを知るには? 「使用しているXPathの実装を知っている」という意味ですか?私はCSharpとHTMLAgilityPackでXPathを使用します – user569008

+0

XPath 2.0をお持ちでない場合、どうすればインストールできますか? – user569008