【发布时间】:2016-02-11 13:20:33
【问题描述】:
我正在努力找出如何导航到使用命名空间的 xml 区域。使用基本的 xpath,我可以很好地导航到消息详细信息节点,但我不确定在进入该块方面我需要做什么,因为里面的所有内容都使用命名空间。请问有人可以帮忙吗?
谢谢
<?xml version="1.0" encoding="UTF-8"?>
<Message>
<MessageList>
<MessageCount>2</MessageCount>
<DateTimeStamp>2016-02-11T12:50:26</DateTimeStamp>
<MessageDetail>
<MessageID>2332445456767</MessageID>
<Env:MessageContainer xmlns:Env="http://www.somesite.com/schema/v1.0/envelope" xmlns:BS="http://www.somesite.com/schema/v1.0/BusinessServices">
<Env:MessageParties>
public List<String> getRefs(String xmlMessageToSend) { try { Document doc = createDocument(xmlMessageToSend.getBytes()); XPath xpath = xPathFactory.newXPath(); xpath.setNamespaceContext(new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if (prefix == null) throw new NullPointerException("Null prefix"); else if ("Env".equals(prefix)) return "http://www.om.com/schema/v1.0/envelope"; else if ("BS".equals(prefix)) return "http://www.o.com/schema/v1.0/BusinessServices"; return XMLConstants.NULL_NS_URI; } @Override public Iterator getPrefixes(String namespaceURI) { throw new UnsupportedOperationException(); } @Override public String getPrefix(String namespaceURI) { throw new UnsupportedOperationException(); } }); XPathExpression exp = xpath .compile("/Message/MessageList/MessageDetail/Env:MessageContainer"); Node result = (Node)exp.evaluate(doc, XPathConstants.NODE); System.out.println(result.getTextContent()); } catch (XPathExpressionException | SAXException | IOException | ParserConfigurationException e) { e.printStackTrace(); } return new ArrayList<String>(); }
【问题讨论】:
-
将命名空间前缀与 nodeName 一起使用。例如:: /Env:MessageContainer
-
您也可以使用一般路径。 //消息详情/*[2]/*[1] ...
-
@Jagrut 没用
-
@Helmer - 这确实有效,但如果有多个消息详细信息节点会如何改变?
-
目前无法回答这个问题。告诉我们您使用 XPath 的编程语言和库 - 并显示此代码。