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 に答える