#java #xml #xpath #null
#java #xml #xpath #null
Вопрос:
При запуске этого кода в Eclipse я получаю только нулевые значения:
String recordsAsXML = "<vGVC:Row xmlns:vGVC="urn:com.versai:Bacon:GetViewContentsResponse.v1.0"><vGVC:Column><vGVC:Value>aaa0</vGVC:Value><vGVC:ObjectName>2ff31656-b10c-11e0-99f6-e01321378d2a</vGVC:ObjectName></vGVC:Column><vGVC:ModifiedAfterQuery>false</vGVC:ModifiedAfterQuery></vGVC:Row>";
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(recordsAsXML));
Document doc = builder.parse(is);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//vGVC:Value/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) resu<
for (int i = 0; i < nodes.getLength(); i ) {
System.out.println(nodes.item(i).getNodeValue());
}
Я пытаюсь извлечь значение «aaa0».
Не могли бы вы помочь мне понять, что я делаю не так?
Заранее спасибо, Михал.
Комментарии:
1. Вы не зарегистрировали
vGVC
пространство имен в своем запросе XPath.
Ответ №1:
Вы должны использовать контекст пространства имен, чтобы сообщить XPath о вашем пространстве имен, например, так:
xpath.setNamespaceContext(new NamespaceContext() {
@Override public Iterator<?> getPrefixes(String namespaceURI) { return null; }
@Override public String getPrefix(String namespaceURI) { return "vGVC"; }
@Override public String getNamespaceURI(String prefix) { return "urn:com.versai:Bacon:GetViewContentsResponse.v1.0"; }
});
Это следует сделать перед вызовом evaluate
, и если у вас есть более одного пространства имен для обработки, вы можете добавить их все в одну реализацию и использовать if
инструкции для возврата правильного префикса / URI.
Более подробная информация в javadocs здесь: http://download.oracle.com/javase/6/docs/api/javax/xml/namespace/NamespaceContext.html