8

このファイルに対して XPath クエリを実行したい (抜粋を表示):

<?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"/>

これは私が使用しているコードのスニペットです:

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);

私が直面している問題は、デフォルトの名前空間が XPath クエリで参照されている場合、それを解決するために getNamespaceURI メソッドが呼び出されないことです。たとえば、次のクエリは何も抽出しません。

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

xmlnsここで、パーサーを偽のプレフィックスに置き換えてdから、それに応じてメソッドを作成することでパーサーを「だます」ことを試みました (遭遇したときgetNamespaceURIに戻るように)。この場合、が呼び出されますが、XPath 式の評価の結果は常に空の文字列になります。http://xml.sap.com/2002/10/metamodel/webdynprodgetNamespaceURI

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

デフォルトの名前空間で物事を適切に機能させる方法はありますか?

4

2 に答える 2

13

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

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

于 2012-05-23T16:19:10.907 に答える
11

Namespaceコンテキストで、選択したプレフィックス (例: df) をドキュメントの名前空間 URI にバインドします。

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

于 2012-05-23T13:26:05.067 に答える