2

私はEclipseの下でJavaでXPathを使用しています。SOAP Web サービスを作成しています。XML はプレフィックスと名前空間を使用しています。より読みやすい XML ドキュメントを好むため、プレフィックスを削除して名前空間のみを保持したいと考えました。

XML 定義ファイルからプレフィックスを削除し、XPath を使用して XML をクエリしようとすると、XML のすべてのノードで null が取得され始めました。

XPath を使用する場合、プレフィックスを使用する必要がありますか? 名前空間だけで十分ではありませんか?

<myrequest
    xmlns="http://www.mywebsite.com/xml/webservice"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mywebsite.com/xml/webservice Request.xsd">

   <state>     
       <value>demox</value>

これが私のXMLの開始方法であり、XPathでこれをクエリすると、XPath.selectSingleNode()その中のすべてのノードに対して常にXPathからnullを受け取るようになります。

String myExpression = "myrequest/state/value";  
Document doc = new Document(requestXML);    
Element e = doc.getRootElement();
request.setMybase(getBase((org.jdom.Element) 
            XPath.selectSingleNode(doc,myExpression)));
4

3 に答える 3

3

これは、いくつかの XPath 関連のタグに関する最もよくある FAQです。

XMLドキュメントにデフォルトの名前空間がある場合(あなたの場合のように)、XPath式の要素名には、このデフォルトの名前空間にバインドされた接頭辞を付ける必要があります。バインドは、通常、特定のメソッド/関数を使用して「既定の名前空間を登録する」ことにより、XPath のホスティング言語で実行されます。

これを行う必要がある理由:

XPath 式にプレフィックスのない名前がある場合、XPath はこの名前を「名前空間なし」に属するものとして扱います。

XPath 1.0 W3C 仕様の規範的なテキストは次のとおりです。

"ノード テストの QName は、式コンテキストからの名前空間宣言を使用して、展開された名前に展開されます。これは、xmlns で宣言されたデフォルトの名前空間が使用されません: QName にプレフィックスがない場合、名前空間 URI は null です(これは、属性名が展開されるのと同じ方法です). QName に、式に名前空間宣言がないプレフィックスがある場合はエラーですコンテキスト"。

したがって、/a/b/cデフォルトの名前空間を持つドキュメントを評価するということは、次のことを意味します: 「名前空間なし」にあり、「名前空間なし」にある という名前の要素をすべて選択しc、その親はb「名前空間なし」にある という名前の要素であり、その親は xml ドキュメントの最上位要素です名前が付けられa、「名前空間なし」にあります。

ドキュメント内のすべての要素は、「名前空間なし」ではなくデフォルトの名前空間にあるため、この XPath 式は何も選択しません

解決策:

  1. XPath エンジンの API で、デフォルトの名前空間を登録し、それにプレフィックス ("x" など) をバインドします。

  2. /x:myrequest/x:state/x:valueこれで、次のXPath 式を使用できるようになり、使用する必要があります。/myrequest/state/value

于 2011-04-10T16:30:44.270 に答える
2

XPath 1.0 で名前空間内の要素を選択するには、XPath 式でプレフィックスを使用して要素名を修飾する必要があります。したがって、XPath 式でプレフィックスを使用せずにデフォルトの名前空間宣言を使用するように XML をクリーンアップしても、デフォルトの名前空間にバインドされたプレフィックスを使用する必要があります ( http://www.mywebsite.com/xml/webservice)。プレフィックスを名前空間 URI にバインドする方法は、使用する XPath API によって異なります。私は JDOM に詳しくありません。プレフィックスを名前空間 URI にバインドする方法については、その API を自分で確認してください。

[編集] メソッドはhttp://www.jdom.org/docs/apidocs/org/jdom/xpath/XPath.html#addNamespace%28java.lang.String,%20java.lang.String%29です。好きなプレフィックス (例: "pf") を選択して実行addNamespace("pf", "http://www.mywebsite.com/xml/webservice")し、XPath でそのプレフィックスを使用します (例: "pf:myrequest/pf:state/pf:value")。

于 2011-04-10T16:29:16.780 に答える
1

私の質問は、Xpathを使用したい場合、プレフィックスを使用する必要がありますか?名前空間だけで十分ではありませんか?

XPathを使用する場合は、名前空間プレフィックスを使用する必要はありません。名前空間だけで十分ですが、名前空間プレフィックスを登録して使用すると、XPathがはるかに簡潔になり、読みやすく、保守しやすくなります。

次のように、および条件を指定する述語フィルターを使用して、要素(つまり)の一般的な一致を含むXPathを使用できます。*local-name()namespace-uri()

/*[local-name()='myrequest' 
   and namespace-uri()='http://www.mywebsite.com/xml/webservice'] 
    /*[local-name()='state' 
       and namespace-uri()='http://www.mywebsite.com/xml/webservice']
      /*[local-name()='value' 
         and namespace-uri()='http://www.mywebsite.com/xml/webservice']

ただし、名前空間を登録し、XPathでnamepace-prefixを使用する方がはるかに簡単です。(例/ws:myrequest/ws:state/ws:value

于 2011-04-10T17:33:28.527 に答える