XPath search by "id" attribute , giving NPE - Java

52,219

Solution 1

Try this:

//readAudit[@id='root']

This selects all readAudit elements with the id attribute set to root (it should be just 1 element in your case).

You could make sure it returns maximum 1 element with this:

//readAudit[@id='root'][1]

Solution 2

What you are doing is selecting SiebelMessage nodes with the attribute id='root'.

But the SiebelMessage doesn't have an id, it's the readAudit you are after. So either do

//readAudit[id='root']

or

//SiebelMessage//readAudit[id='root']
Share:
52,219
tomaytotomato
Author by

tomaytotomato

Updated on July 10, 2022

Comments

  • tomaytotomato
    tomaytotomato almost 2 years

    All,

    I have multiple XML templates that I need to fill with data, to allow my document builder class to use multiple templates and insert data correctly

    I designate the node that I want my class to insert data to by adding an attribute of:

    id="root"

    One example of an 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);
    

    Using this example: XPath to select Element by attribute value

    The expression is not working:

    //SiebelMessage[@id='root']

    Any ideas what I am doing wrong?