0

以下のコードでは、XPath を使用して「ハンドラ」XML 要素にアクセスしようとしていますが、うまくいきません。「elemHandler」要素は常に null です。誰でも私と明白な解決策を共有できますか? 前もって感謝します。

import java.io.IOException;
import java.io.StringReader;

import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

public class XPathTest {
    private static String jobString = "<job name=\"Workflow.JOB\">" + 
                                           "  <handler name=\"xslt.converter\"/>" +
                                           "  <handler name=\"openoffice.renderer\">" +
                                           "    <opts input=\"ODS\" output=\"PDF\"/>" +
                                           "  </handler>" +
                                           "</job>";

    public static void main(String[] args) {
    try {
        Element elemJobInfo = new SAXBuilder().build(new StringReader(jobString)).detachRootElement();
        XPath handlerExpression = XPath.newInstance("//stp:handler[2]");
        handlerExpression.addNamespace("stp", "http://service.mine.org/dgs");
        Element elemHandler = (Element) handlerExpression.selectSingleNode(elemJobInfo);
        jobString = elemHandler.toString();
    }
    catch (IOException e) {
        System.out.println("Failure: " + e);
    }
    catch (JDOMException e) {
        System.out.println("Failure: " + e);
    }
    catch (Exception e) {
        System.out.println("Failure: " + e);
    }
}
}
4

2 に答える 2

1

XPath式の対象となるXMLドキュメント:

//stp:handler[2]

評価され、デフォルトまたは宣言された名前空間がなく、すべてのノードが「名前空間なし」にあります。"http://service.mine.org/dgs"名前空間にノードがありません。実際のケースで別のXMLドキュメントを使用している場合を除き、上記の式でノードを選択してはなりません。これがまさに得られるものです。

表示していないドキュメントを使用している場合、実際にはデフォルトの名前空間があり、Javaコードで名前空間のスペルを間違えている可能性があります。

また、XPath式のこのバリエーション(名前空間プレフィックスの有無にかかわらず)を試してください。

(//stp:handler)[2]

于 2010-07-24T22:22:39.067 に答える
1

stp名前空間はどうなっていますか?の XML はjobString名前空間を参照していません。接頭辞なしで試しましたか?

//handler[2]
于 2010-07-24T21:19:54.783 に答える