2012-05-23 11 views
7

デフォルトの名前空間のxmlnsを持つクエリは、(抜粋が示さ):のJavaのXPath:私は、このファイルのXPathクエリを実行したい

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document document = builder.parse(new File(testFile)); 
XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
... 

String result = xpath.evaluate(xpathQueryString, document); 
System.out.println(result); 
:これは私が使用しているコードの抜粋である

<?xml version="1.0" encoding="UTF-8"?> 
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST --> 
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0"> 
    <ModelClass.Parent> 
     <Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/> 

私が直面している問題は、デフォルトネームスペースがXPathクエリで参照されているときに、getNamespaceURIメソッドが呼び出されて解決されないということです。 は、例えばこのクエリは何も抽出しない:

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

は今、私はそうhttp://xml.sap.com/2002/10/metamodel/webdynproを返すために(偽の接頭辞dxmlnsを交換し、それに応じてgetNamespaceURIメソッドを書くことでパーサを「だまし」試してみましたdに遭遇したとき)。この場合、getNamespaceURIが呼び出されますが、XPath式の評価結果は常に空の文字列です。

ファイルとXPathクエリ式から名前空間を取り除くと、私が望む文字列(com.test.mypackage)を取得できます。

デフォルトの名前空間で正常に機能するようにする方法はありますか?

あなた Namespace文脈では

答えて

8

、文書内の名前空間URIに(例えばdf)お好みの接頭辞をバインド

xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
     switch (prefix) { 
     case "df": return "http://xml.sap.com/2002/10/metamodel/webdynpro"; 
     ... 
     } 
    }); 

、その後、例えば、要素名を修飾するために、あなたのパス式でそのプレフィックスを使用します/df:ModelClass/df:ModelClass.Parent/df:Core.Reference[@type = 'Model']/@package

+0

こんにちは、私は試しましたが、うまくいきません... –

+4

名前空間を認識するDocumentBuilderも作成してくださいhttp://docs.oracle.com/javase/6/docs/api/javax/ xml/parsers/DocumentBuilderFactory.html#setNamespaceAware%28ブール値%29名前空間を操作する前に。 –

+0

それはトリックでした。私はDocumentBuilderがデフォルトで名前空間を認識していると考えました。ありがとうございました。 –

10

XPath 1.0仕様では、「接頭辞は名前空間を持たない」ことを要求しています。したがって、XPath 1.0用に設計されたJAXPは、null以外の名前空間に「ヌルプレフィックス」をバインドするのを止めることができます。

XPath 2.0では、XPath式の修飾されていない名前に対してデフォルトの名前空間を宣言できますが、この機能を利用するAPI(Saxonのs9apiなど)が必要です。

+0

マイケルに追加情報をありがとうございます。 –