Резюме
Вы можете попробовать следующее выражение, которое позволяет вам выбирать узлы, не заботясь о пространстве имен ns0
:
/*[local-name()='GetADSLProfileResponse']/*[local-name()='Result']/*
Объяснение
В вашем синтаксисе несколько частей были неверными. Давайте посмотрим вместе. Синтаксис XPath /xml
означает, что корневым узлом документа является <xml>
, но корневым элементом является <ns0:GetADSLProfileResponse>
; GetADSLProfileResponse
тоже неверно, потому что ваш XML-файл содержит пространство имен. То же самое для Result
:
/xml/GetADSLProfileResponse/Result
В моем решении я проигнорировал пространство имен, потому что ваше предоставленное пространство имен является неполным. Вот полная программа, чтобы начать:
String XML =
"<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n"
+ "<ns0:GetADSLProfileResponse xmlns:ns0 = \"http://\">\n"
+ " <ns0:Result>\n"
+ " <ns0:eCode>0</ns0:eCode>\n"
+ " <ns0:eDesc>Success</ns0:eDesc>\n"
+ " </ns0:Result>\n"
+ "</ns0:GetADSLProfileResponse> ";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document;
try (InputStream in = new ByteArrayInputStream(XML.getBytes(StandardCharsets.UTF_8))) {
document = builder.parse(in);
}
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xPath.compile("/*[local-name()='GetADSLProfileResponse']/*[local-name()='Result']/*");
NodeList nodeList = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
System.out.println(node.getNodeName() + ": " + node.getTextContent());
}
Он печатает:
ns0:eCode: 0
ns0:eDesc: Success
Смотри также: