web-dev-qa-db-ja.com

「id」属性によるXPath検索、NPEの指定-Java

すべて、

ドキュメントビルダークラスが複数のテンプレートを使用してデータを正しく挿入できるように、データを入力する必要がある複数のXMLテンプレートがあります。

次の属性を追加して、クラスにデータを挿入するノードを指定します。

id = "root"

XMLの一例

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<SiebelMessage MessageId="07f33fa0-2045-46fd-b88b-5634a3de9a0b" MessageType="Integration Object" IntObjectName="" IntObjectFormat="Siebel Hierarchical" ReturnCode="0" ErrorMessage="">
    <listOfReadAudit >
        <readAudit id="root">
            <recordId mapping="Record ID"></recordId>
            <userId mapping="User ID"></userId>
            <customerId mapping="Customer ID"></customerId>
            <lastUpd mapping="Last Updated"></lastUpd>
            <lastUpdBy mapping="Last Updated By"></lastUpdBy>
            <busComp mapping="Entity Name"></busComp>
        </readAudit>
    </listOfReadAudit>
</SiebelMessage>

コード

expr = xpath.compile("//SiebelMessage[@id='root']");
root = (Element) expr.evaluate(xmlDoc, XPathConstants.NODE);
Element temp = (Element) root.cloneNode(true);

この例を使用: 属性値で要素を選択するXPath

式が機能していません:

// SiebelMessage [@ id = 'root']

私が間違っていることは何ですか?

17
tomaytotomato

これを試して:

//readAudit[@id='root']

これにより、readAudit属性がidに設定されたすべてのroot要素が選択されます(この場合、要素は1つだけである必要があります)。

次のようにして、最大1つの要素が返されるようにすることができます。

//readAudit[@id='root'][1]
27
Stefan Pries

あなたがしているのは、属性id = 'root'を持つSiebelMessageノードを選択することです。

しかし、SiebelMessageにはIDがありません。それは、あなたが後にしているreadAuditです。だからどちらか

//readAudit[id='root']

または

//SiebelMessage//readAudit[id='root']
2
kutschkem