2011-02-10 5 views
6

私が見た名前空間に依存しない構文は私を混乱させます。名前空間無関係要素の内容を持つXPathクエリ

は、私が持っていると言う:

<root> 
    <parent attribute="A">A<child>A</child></parent> 
    <parent attribute="B">B<child>B</child></parent> 
</root> 

これまでのところ、私はどのように参照してください。

/root/parent/child/text() 

がに変換:

/*[local-name()='root']/*[local-name()='parent']/*[local-name()='child']/text() 

しかし、私はこのようなものに苦しんでいる:

/root/parent[@attribute="A"]/child/text() 

か:

/root/parent[text()="B"]/child/text() 

か:

/root/parent[1]/child/text() 

どのようにこれらを翻訳していますか?

おかげで、

EDIT:ワン・モア:-)

<root> 
     <parent> 
      <childName>serverName</childName> 
      <childValue>MyServer</childValue> 
     </parent> 
     <parent> 
      <childName>ServerLocation</childName> 
      <childValue>Somewhere</childValue> 
     </parent> 
</root> 

、これはどのように翻訳しない

/root/parent[childName="serverName"]/childValue/text() 
+0

良い質問、+1になります。提供されたすべてのXPath式の推奨、警告、完全な翻訳については私の答えをご覧ください。 –

答えて

10

私は 周りを見てきました名前空間にとらわれない構文は私を混乱させています。

まず、私はそれが混乱している場合は特に、この構文を使用するためにあなたにないを助言します。また、エラーが発生する可能性があります - 詳細については私の答えの最後を参照してください。

ネームスペースにあるXPath式の名前を指定する標準的な方法は、ネームスペースをXPathエンジンに登録し(それぞれのベンダー固有のドキュメントを参照)、次に登録されたネームスペースにバインドされたプレフィックスを使用することですx:someName

などの名前のある良い答えがたくさんあります。そのうちの1つを使用してください。今

、何らかの理由であなたはまだ、その後、紛らわしい構文を使用することにした場合:

しかし、私は このようなことに苦しんでいます:

/root/parent[@attribute="A"]/child/text()

使用

/*[local-name()='root']/*[local-name()='parent' and @attribute='A'] 
その後、

か:

/root/parent[text()="B"]/child/text()

使用:その後、

/*[local-name()='root']/*[local-name()='parent' and text()='B'] 
            /*[local-name()='child']/text() 

か:

/root/parent[1]/child/text() 

使用:その後、

/*[local-name()='root']/*[local-name()='parent'][1] 
           /*[local-name()='child']/text() 

<root> 
    <parent> 
     <childName>serverName</childName> 
     <childValue>MyServer</childValue> 
    </parent> 
    <parent> 
     <childName>ServerLocation</childName> 
     <childValue>Somewhere</childValue> 
    </parent> 
</root> 
:-)

ワン・モア

これはどのように翻訳されますか?

/root/parent[childName="serverName"]/childValue/text() 

使用:XML文書に同じ地元との要素がある場合

このような表現は、希望のノードを選択しない場合があります

/*[local-name()='root'] 
     /*[local-name()='parent'][*[local-name()='childName"]='serverName'] 
              /*[local-name()='childValue']/text() 

注意してください。 -nameは2つの異なる名前空間に属します。

+0

+1は53秒で私を打つ。 :-) – LarsH

+0

+1あなたの両方のために。 – Flack

+0

ありがとうDimitre、あなたの警告に注意してください:-)残念ながら、私はInstallShieldでシステム検索機能で使用する必要があるため、このタイプのxpathを使用することを余儀なくされています。残念ながら、この機能は名前空間を定義する方法を提供しません。私が探しているXMLファイルには1つの名前空間しかないので、私は安全です。彼らはTomcat web.xml設定ファイルです。ありがとう! –

4

私が意味する、あなたの質問を理解し、どのように私はこれらのXPath式が名前空間に依存しない作るのですか? (これは特殊な構文、ローカル名()関数のただ一般的な使用ではありません。)

/root/parent[@attribute="A"]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][@attribute='A']/*[local-name()='child']/text() 

あなたならば(あなたは属性値のための二重引用符を使用することができますになるだろうしかし、それはXSLTやあなたの環境が何であれ埋め込むのが難しくなります。)

/root/parent[text()="B"]/child/text() 

/*[local-name()='root']/*[local-name()='parent'][text() = 'B']/*[local-name()='child']/text() 

そして

/root/parent[1]/child/text() 

なる

/*[local-name()='root']/*[local-name()='parent'][1]/*[local-name()='child']/text() 
+0

+1とほぼ同じくらい速いです:) –

+0

ロング・ノー・シー:)あなたはどこにいましたか?私はこれがあなたにとって興味深いと思う:http://dnovatchev.wordpress.com/2011/02/08/the-binary-search-tree-data-structurehaving-fun-with-xpath-3-0/ –

+0

+1あなたの両方のために。 – Flack

関連する問題