1

アプリケーションで XML XPath API を使用しています

これは私のソープリクエストです

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tes="http://testwork/">
       <soapenv:Header/>
       <soapenv:Body>
          <tes:sayHelloWorldFrom>
             <!--Optional:-->
             <arg0>value</arg0>
          </tes:sayHelloWorldFrom>
       </soapenv:Body>
    </soapenv:Envelope>

このメッセージから本文を取得したいので、

<soapenv:Body>
          <tes:sayHelloWorldFrom>
             <!--Optional:-->
             <arg0>value</arg0>
          </tes:sayHelloWorldFrom>
 </soapenv:Body>

私のコードは次のようになります

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        org.w3c.dom.Document doc = null;
        try {
            doc = factory.newDocumentBuilder().parse(is);
            XPathFactory xFactory = XPathFactory.newInstance();
            XPath xPath = xFactory.newXPath();
            Object result = xPath.compile("/soapenv:Envelope/soapenv:Body").evaluate(doc, XPathConstants.NODESET);
            NodeList nodes = (NodeList) result;
            log.info("result " + nodes);

しかし、結果は result com.sun.org.apache.xml.internal.dtm.ref.DTMNodeList@19f76837

それで、私は何を間違っていますか?

4

1 に答える 1

4

XPathConstants.NODESETNodeListクエリに一致する結果を返すように API に指示します。

これは、可変数の一致が予想される場合に便利です。リストを反復処理できます...

for (int index = 0; index < nodes.getLength(); index++) {
    Node node = nodes.item(index);
    //...
}

1 つの結果しか得られないと確信している場合 (または最初の一致だけが必要な場合) は、XPathConstants.NODE代わりに次を使用できます。

Object result = xPath.compile("/soapenv:Envelope/soapenv:Body").evaluate(doc, XPathConstants.NODE);
Node node = (Node)result;

更新しました

次のことをせずにこれを行うことはおそらくありませんが、名前空間は私の頭を悩ませます...

falseを作成しfactory, set it's name space awareness toたら、検索からノード名前空間コンテキストを削除します。たとえば...

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
org.w3c.dom.Document doc = null;
try {
    doc = factory.newDocumentBuilder().parse(new File("Soap.xml"));

    XPathFactory xFactory = XPathFactory.newInstance();
    XPath xPath = xFactory.newXPath();
    Object result = xPath.compile("/Envelope/Body").evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    System.out.println("Found " + nodes.getLength() + " matches");
    for (int index = 0; index < nodes.getLength(); index++) {
        Node node = nodes.item(index);
        System.out.println(node);
    }
} catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException exp) {
    exp.printStackTrace();
}
于 2013-10-11T00:33:26.197 に答える