Разбор ответного сообщения мыла с использованием XPath - PullRequest
1 голос
/ 16 ноября 2011

Я пытаюсь разобрать ответ мыла, используя xpath, ниже некоторого кода ответного сообщения.

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:Get__CompIntfc__CI_PERSONAL_DATAResponse
xmlns:ns1="http://xmlns.oracle.com/Enterprise/Tools/schemas/M985361.V1">
<ns1:PROP_EMPLID>AA0001</ns1:PROP_EMPLID>
<ns1:PROP_LAST_NAME>Adams</ns1:PROP_LAST_NAME><ns1:PROP_FIRST_NAME>Kimberly</ns1:PROP_FIRST_NAME>
</ns1:Get__CompIntfc__CI_PERSONAL_DATAResponse >
</soapenv:Body>
</soapenv:Envelope>

Я пытаюсь разобрать его как ...

DocumentBuilderFactory domFactory =DocumentBuilderFactory.newInstance();
     domFactory.setNamespaceAware(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder();
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     response.writeTo(out); 
InputStream is = new ByteArrayInputStream( out.toByteArray() ); 
Document doc = builder.parse( is );
        XPathExpression expr = xpath.compile("//ns1:PROP_EMPLID/text()");
           Object res = expr.evaluate(doc, XPathConstants.NODESET);
           NodeList nodes = (NodeList) res;
    for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getNodeValue()); 
       }

Этоне дает требуемого значения «AA0001», но когда я использую xpath.compile("//*/text()"), он правильно печатает все значения текстового узла.

Скажите, пожалуйста, в чем проблема, потому что я хочу получить некоторые конкретные значения из ответа, а не все текстовые значения.1011 *

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Вы пытаетесь получить узел в пространстве имен, представленном префиксом ns1, но у вашего приложения нет представления , что представляет этот префикс, потому что вы не связали это имя с каким-либо действительнымПространство имен.Способ сделать это в Java (как упомянуто @newtover) - зарегистрировать экземпляр javax.xml.namespace.NamespaceContext с вашим xpath объектом.Примерно так:

xpath.setNamespaceContext(namespaces);

К сожалению, нет реализации по умолчанию этого интерфейса.Вам нужно будет свернуть свой собственный.Полный пример можно найти здесь:

... или следуя @ссылка на новую версию.

1 голос
/ 16 ноября 2011

Вы должны добавить NamespaceContext к выражению xpath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...