1

次のxmlがあります。xpath クエリを使用して、ルート ノードのすべての子ノードを取得する必要があります。xpath 式はどのように記述できますか?

<rootElement> 

  <rootElementOne xmlns="http://some.com"> 
    <rootElementTwo> 
      <Id>12345</balId> 
      <name>Name1</businessName> 
     </rootElementTwo> 
  </rootElementOne> 

  <rootElementOne xmlns="http://some.com"> 
    <rootElementTwo> 
      <Id>6789</balId> 
      <name>Name2</businessName> 
     </rootElementTwo> 
  </rootElementOne>  

</rootElement>

式は以下の結果を返す必要があります。

      <rootElementOne xmlns="http://some.com"> 
        <rootElementTwo> 
          <Id>12345</balId> 
          <name>Name1</businessName> 
         </rootElementTwo> 
      </rootElementOne> 

      <rootElementOne xmlns="http://some.com"> 
        <rootElementTwo> 
          <Id>6789</balId> 
          <name>Name2</businessName> 
         </rootElementTwo> 
      </rootElementOne>

使ってみrootElement/rootElementOne/*ましたが効果なし。

ありがとう!

4

2 に答える 2

6

ここでは用語に注意してください。XML では、少なくとも XPath 用語では、「ルート ノード」は、ドキュメント内のすべての要素、テキスト ノード、コメント、処理命令、およびその他のノードの (目に見えない) 祖先です。ルート ノードは、XPath 式によってアドレス指定されます/これは要素ではありませんが、ドキュメント要素とも呼ばれる最も外側の要素の親です。XML ドキュメントでは、ルート ノードは の親です。<rootElement>

すべての「ルート ノードの子ノード」は、次の XPath 式によって選択されます。

/node()

しかし、それは 1 つの要素、つまり を返します<rootElement>が、これはあなたが望む結果ではありません。

代わりに、おそらくdocument elementのすべての子ノードが必要になるため、これが XPath 式になります。

/*/node()

これにより、要素が返さ<rootElementOne>れ、(設定によっては) それらの間の空白で構成されるテキスト ノードも返されます。

または、ドキュメント要素のすべての要素の子が必要な場合もあります。つまり、テキスト ノード、コメント、または要素以外のことは気にしません。(XML の詳細に詳しくない多くの人は、「要素ノード」を意味するときに「ノード」と呼んでいます。)

それが必要な場合、その XPath 式は次のとおりです。

/*/*

またはあなたの場合、あなたはすることができます

/rootElement/some:rootElementOne

wheresomeは、XPath の外側で のネームスペース プレフィックスとして宣言されていますhttp://some.com。Java で XPath の名前空間プレフィックスを宣言する方法を知りたい場合は、お知らせください。XPath を呼び出すために既に使用している Java コードを示してください。または、このサイトで検索してください。コード例を含む適切な回答が既にあるためです。

を試したときrootElement/rootElementOne/*、ネームスペースが原因で何も選択されませんでした。(XPath 1.0 の)形式の XPath ステップは、rootElementOne「名前空間のない rootElementOne という名前の要素」を意味します。(XPath 2.0 では、「既定の XPath 名前空間内」を意味し、XPath の外部に既定の XPath 名前空間を設定する方法があります。) したがって、要素が名前空間内にあるのrootElementOneに対し、名前空間なしを要求しました。<rootElementOne>http://some.com

名前空間に依存しないようにしたい場合は、*代わりに を使用rootElementOneするか、 を使用できます*[local-name() = 'rootElementOne']。ただし、XML と XPath で名前空間を使用する方法がわからないためにこれを行う場合は、習得するまで、それらはおそらくあなたの肉体のとげであり続けるでしょう。:-)

それが修正されると、<some:rootElementTwo>( の子要素を要求したためrootElementOne) 2 つの要素を取得する必要がありますが、これはドキュメントのルート ノードのコンテキストでのみ機能します。これは、要素名で始まる XPath 式Xが実際にはで始まるためchild::Xです。つまり、コンテキスト ノードの子です。その時点でコンテキスト ノードが何であるかがわからない場合、またはコンテキスト ノードに依存したくない場合は、または で XPath 式を開始し/ます//。これにより、ドキュメントのルート ノードから開始するように XPath に指示されます。

于 2013-02-21T19:26:10.257 に答える
1

/rootElement/*rootElementOne何らかのアクションを実行できるすべての場所に戻ります

/rootElement//*以下のすべてを返しますrootElement

于 2013-02-21T12:00:59.013 に答える