final SAXBuilder builder = new SAXBuilder();
final Document xml = builder.build( file );
final Element root = (Element) xml.getRootElement();
Element child = root.getChild("Header", Namespace.getNamespace("http://www.editeur.org/icedis/claims"));
final XPathContext ctx = XPathContext.create(root);
这是我的代码。 XPathContext只是JXPathContext的包装。如您所见,'child'变量使用带有命名空间的构造,如果我删除它将无法工作。
但是现在我正试图通过像这样的XPath从XML中获取价值
ctx.getValue("/Header/SentDateTime")
并且,当然它总是返回null。似乎解决方案很简单,但我无法在互联网上找到它。如果我从XML文件中删除xmlns,一切都会起作用,但这不是一个选项。那我该如何使用这个xml?
此外,XML文件的简短版本:
<?xml version="1.0" encoding="UTF-8"?>
<ICEDISClaimMessage version="0.1" xmlns="http://www.editeur.org/icedis/claims">
<Header>
<Sender>
<SenderIdentifier>
<SenderIDType>06</SenderIDType>
<IDValue>1234567890128</IDValue>
</SenderIdentifier>
<SenderName>Apogee Agency</SenderName>
</Sender>
<Addressee>
<AddresseeIdentifier>
<AddresseeIDType>06</AddresseeIDType>
<IDValue>2345678901237</IDValue>
</AddresseeIdentifier>
</Addressee>
<MessageNumber>111</MessageNumber>
<SentDateTime>20101001</SentDateTime>
<MessageNote>Sample file 1: a claim made by an agent to a publisher for a journal issue not yet delivered</MessageNote>
</Header>
</<ICEDISClaimMessage>
答案 0 :(得分:0)
您需要将XPath表达式与名称空间上下文一起使用。它必须看起来像这样:
final XPathContext ctx = XPathContext.create(root);
ctx.addNamespaceMapping("ns", "http://www.editeur.org/icedis/claims");
... = ctx.getValue("/ns:Header/ns:SentDateTime");
注意:我不知道JXPath是否支持名称空间,如果是,它是如何设置的。
顺便说一句,看起来你正在使用JDOM(SAXBuilder)。在这种情况下,我建议使用内置XPath函数的JDOM,而不是构建包装器。