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/'.