0
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 的包装器。如您所见,使用带有命名空间的构造的“子”变量,如果我将其删除,它将不起作用。

但是现在我正在尝试使用这样的 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>
4

1 回答 1

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,而不是构建包装器。

于 2012-12-27T11:40:47.193 回答