XML + XPATH: есть ли способ работать с пространством имен по умолчанию?

У меня есть результат XML SOAP:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <CreateCIInStockResponse xmlns="http://somenamespace.com/">
      <CreateCIInStockResult>
        <Status>OK</Status>
        <Data>SOMERESULT</Data>
      </CreateCIInStockResult>
    </CreateCIInStockResponse>
  </soap:Body>
</soap:Envelope>

Как видите, пространство имен, определенное в CreateCIInStockResponse, использует пространство имен по умолчанию - префикс не определен.

Я могу получить статус и данные, если мы используем

/soap:Envelope/soap:Body/node()/node()/node()/text()

Прав ли я, что нет способа - с помощью XPath - получить прямой доступ к содержимому "данных"?

Моя проблема в том, что я не могу ни изменить вызов веб-службы, ни изменить результат, возвращаемый из веб-службы. Все, что я могу сделать, это использовать XPath для вывода моих данных.

Какие-либо предложения?

1 ответ

Решение

Присвойте http://somenamespace.com/ префиксу пространства имен, скажите "def", и используйте это в своем выражении XPath:

/ Мыло: Конверт / мыло:Body/ Def:CreateCIInStockResponse/ Def: Данные

Как назначить префикс, зависит от вашего процессора XPath.

Обновлено: альтернативный подход, если назначение префикса не вариант:

/soap:Envelope/soap:Body/*[local-name()='CreateCIInStockResponse']/*[local-name()='Data']

Чтобы быть абсолютно уверенным, что вы получаете доступ к ожидаемым элементам, вы также можете добавить namespace-uri () = ' http://somenamespace.com/'.

Другие вопросы по тегам