web-dev-qa-db-fra.com

Recherche XPath par attribut "id", donnant NPE - Java

Tout,

J'ai plusieurs modèles XML que je dois remplir avec des données, pour permettre à ma classe de création de documents d'utiliser plusieurs modèles et d'insérer correctement les données

Je désigne le nœud auquel je veux que ma classe insère des données en ajoutant un attribut de:

id = "root"

Un exemple de 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>

Code

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

En utilisant cet exemple: XPath pour sélectionner l'élément par valeur d'attribut

L'expression ne fonctionne pas:

// SiebelMessage [@ id = 'root']

Des idées sur ce que je fais mal?

23
tomaytotomato

Essaye ça:

//readAudit[@id='root']

Cela sélectionne tous les éléments readAudit avec l'attribut id défini sur root (il ne doit s'agir que d'un élément dans votre cas).

Vous pouvez vous assurer qu'il renvoie au maximum 1 élément avec ceci:

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

Ce que vous faites est de sélectionner des nœuds SiebelMessage avec l'attribut id = 'root'.

Mais le SiebelMessage n'a pas d'identifiant, c'est le readAudit que vous recherchez. Alors soit

//readAudit[id='root']

ou

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