0

I have this xml file:

<?xml version="1.0" encoding="UTF-8"?>

<iet:aw-data xmlns:iet="http://care.aw.com/IET/2007/12" class="com.aw.care.bean.resource.MessageResource">
  <iet:metadata filter=""/>
  <iet:message-resource>
    <iet:message>some message 1</iet:message>
    <iet:customer id="1"/>
    <iet:code>edi.claimfilingindicator.11</iet:code>
    <iet:locale>iw_IL</iet:locale>
  </iet:message-resource>
  <iet:message-resource>
    <iet:message>some message 2</iet:message>
    <iet:customer id="1"/>
    <iet:code>edi.claimfilingindicator.12</iet:code>
    <iet:locale>iw_IL</iet:locale>
  </iet:message-resource>
  .
  .
  .
  .

</iet:aw-data>

Using this code below i'm getting over the data and finding what I need.

try {
    FileInputStream fileIS = new FileInputStream(new File("resources\\bootstrap\\content\\MessageResources_iw_IL\\MessageResource_iw_IL.ctdata.xml"));
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    builderFactory.setNamespaceAware(true); // never forget this!

    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    Document xmlDocument = builder.parse(fileIS);
    XPath xPath = XPathFactory.newInstance().newXPath();

    String query = "//*[local-name()='message-resource']//*[local-name()='code'][contains(text(), 'account')]";
    NodeList nodeList = (NodeList) xPath.compile(query).evaluate(xmlDocument, XPathConstants.NODESET);

    System.out.println("size= " + nodeList.getLength());

    for (int i = 0; i < nodeList.getLength(); i++) {
        System.out.println(nodeList.item(i).getNodeValue());
    }
}
catch (Exception e){
    e.printStackTrace();
}

The issue is that i'm getting only null values while printing in the for loop, any idea why it's happened?

The code needs to return a list of nodes which have a code and message fields that contains a given parameters (same as like SQL query with two parameters with operator of AND between them)

1 Answer 1

3

Check the documentation:

https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html

getNodeValue() applied to an element node returns null.

Use getTextContent().

Alternatively, if you find DOM too frustrating, switch to one of the better tree models like JDOM2 or XOM.

Also, if you used an XPath 2.0 engine like Saxon, it would (a) simplify your expression to

//*:message-resource//*:code][contains(text(), 'account')]

and (b) allow you to return a sequence of strings from the XPath expression, rather than a sequence of nodes, so you wouldn't have to mess around with nodelists.

Another point: I suspect that the predicate [contains(text(), 'account')] should really be [.='account']. I'm not sure of that, but using text() instead of ".", and using contains() instead of "=", are both common mistakes.

Sign up to request clarification or add additional context in comments.

2 Comments

it fixed my problem thanks!! can you also help me with the expression so it could return contains (by given param) for message node ? I don't know how to add a and operator so it would work for another field with the same condition of contains
Please don't ask supplementary questions in comments: ask a new question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.