2016-06-26 5 views
-1

私はちょうどXPathを選び、私のためにクエリの仕事をしようとしていましたが、何とか私が望む要素を取り上げていないのです。ルート要素の直接の子にのみテキストを検索するXPathクエリ文字列?

XMLサンプル:

<?xml version="1.0" encoding="UTF-8"?> 
<d:data xmlns:d="defiant-namespace" d:constr="Array" d:mi="8"> 
    <d:item d:mi="2"> 
    <name d:constr="String" d:mi="1">Asian Winged Bean</name> 
    </d:item> 
    <d:item d:mi="7"> 
    <image d:mi="5"> 
     <name d:constr="String" d:mi="3">wbss-1a20ed37-e498-47ad-b97d-c36c4d653b66-mps4YI4gNB</name> 
     <url d:constr="String" d:mi="4">http://dropbox.com/7f3f1192-191e-41a6-8bcd-47ab1d30af3b/wbss-1a20ed37-e498-47ad-b97d-c36c4d653b66-mps4YI4gNB</url> 
    </image> 
    <name d:constr="String" d:mi="6">Akha Striped Bean</name> 
    </d:item> 
</d:data> 

私のクエリが最初<item>をピックアップし、それはまた、私はそれはしたくない<image>要素をピックアップ

//*[contains(name,"w")] 

です。子どもではなくトップレベルの要素でのみテキストを検索する方法はありますか?この

+0

私はこのクエリ // * [含まれています(名[1]、「W」)] – nirvana74v

+1

それはそれを解決した場合は、あなたの問題を使用して、それを自分で解決しましたあなたが主張するものではありません。あなたは "トップレベルの要素で子供ではない"と指定しましたが、 '// * [contains(name [1]、" w ")]'はそのような制限を適用しません。 –

+0

こんにちはチャールズ、私が言ったように、私はXPathの初心者であり、XPathの用語によると私の質問にフレーズではないかもしれない、私はサンプルと私が探していた結果を提供した。これは、多くの専門家がQの質問中にこの制限を理解するのに役立ちます。ありがとう:) – nirvana74v

答えて

2

あなたは持っています答えは技術的には正しいが、(今は)有用ではない。それ便利にするためには、次のように似た方法で変更します

/*/*[contains(name,"W")] 

/*/*//*を交換する「標準的なものという(我々は唯一のドキュメントのルートを過ぎて1つのレベルを横断していることを意味しトップレベル")。ところで


- あなたのタイプを知っていれば、あなたは/*を避けることを検討してください。この構成を使用すると、要素型の索引が使用されないため、(索引付き文書に対して操作する場合の)一般的なエンジンの最適化を使用して問合せを高速化できなくなります。

XPathエンジンへの名前空間マップとして{d: "defiant-namespace"}に相当するローカルを渡すと仮定します(プログラミング言語XPathライブラリ&cを知らなくてもわからない操作)パフォーマンスの観点から、以下としたほうが良い:

/d:data/d:item[contains(name, "W")] 
1

変更:

//*[contains(name,"w")] 

この

/*[contains(name,"w")] 

には、 "//" 再帰的にXMLツリーを検索し、 は、 "/" はルートノードのみを見

+0

テスト済みかどうかわかりませんが、一致するとは言わない – nirvana74v

+1

@ nirvana74vこれは、あなたが主張したいものをうまく実装している - トップレベルの要素のみを検索しますその性質上、XML文書には最上位の要素が1つしかないため、単数型です)。あなたの 'item'のどれもトップレベルの要素ではありません。サンプル中の' data'要素だけがトップレベルです。 –

関連する問題