2013-10-11 3 views
0

Я использую XML XPath API в моем приложенииПолучить мыло тела с использованием XPath и XML XPath Апи

Это моя просьба мыло

<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 [email protected]

Так что я делаю неправильно?

ответ

3

XPathConstants.NODESET поручает API возвратить NodeList результатов, которые он находит в соответствии с запросом.

Это полезно, когда вы ожидаете переменное количество совпадений. Вы можете перемещаться по списку ...

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

Если вы уверены, что вы будете получать только один результат (или вы просто хотите, первый матч), вы можете использовать вместо XPathConstants.NODE

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

Обновлено

Там, наверное, далеко, чтобы сделать это, не выполнив следующие действия, но пространства имен делают мою голову ...

После создания factory, set it's name space awareness to false`, то падение космического контекста имя узла из поиска, например ...

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(); 
} 
+0

для (INT индекс = 0; index user2390742

+0

Что значит «unreachable» – MadProgrammer

+0

Возможно, что xPath не нашел совпадения с вашим запросом – MadProgrammer

Смежные вопросы