Добавление пространств имен в AXIOMXPath
XML:
<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>
<wmHotelAvailResponse xmlns="http://host.com/subPath">
<OTA_HotelAvailRS Version="1.001">
</OTA_HotelAvailRS>
</wmHotelAvailResponse>
</soap:Body>
</soap:Envelope>
Код:
String xpathString = "/soap:Envelope/soap:Body/wmHotelAvailResponse/OTA_HotelAvailRS";
AXIOMXPath xpathExpression = new AXIOMXPath(xpathString);
xpathExpression.addNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
xpathExpression.addNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xpathExpression.addNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
OMElement rsMsg = (OMElement)xpathExpression.selectSingleNode(documentElement);
String version = rsMsg.getAttribute(new QName("Version")).getAttributeValue();
Вопрос:
Это прекрасно работает, когда xmlns="http://host.com/subPath"
часть удалена. Я хочу знать, как я могу добавить xmlns="http://host.com/subPath"
часть к xpathExpression
сделать вышеупомянутую работу
Я попробовал ниже, но не сработало.
xpathExpression.addNamespace("", "http://host.com/subPath");
1 ответ
Решение
Решение:
0,1. Добавьте этот код:
xpathExpression.addNamespace("x", "http://host.com/subPath");
0,2. Изменить:
String xpathString = "/soap:Envelope/soap:Body/wmHotelAvailResponse/OTA_HotelAvailRS";
к:
String xpathString = "/soap:Envelope/soap:Body/x:wmHotelAvailResponse/x:OTA_HotelAvailRS";
Пояснение:
Xpath всегда обрабатывает любое имя без префикса как принадлежащее "без пространства имен".
Поэтому при оценке выражения XPath:
/soap:Envelope/soap:Body/wmHotelAvailResponse/OTA_HotelAvailRS
Оценщик пытается найти wmHotelAvailResponse
элемент, который находится в "нет пространства имен" и не работает, потому что единственный wmHotelAvailResponse
элемент в документе принадлежит пространству имен "http://host.com/subPath".