2

I have a question concering the returning of values from deep within a xml structure. First, here's the xml-code:

<?xml version="1.0" encoding="UTF-8" ?> <log> <published>2014-03-28T15:28:36.646Z</published> <actor> <objectType>person</objectType> <id>e1b8948f-321e-78ca-d883-80500aae71b5</id> <displayName>anonymized</displayName> </actor> <verb>update</verb> <object> <objectType>concept</objectType> <id>a1ad6ace-c722-ffa9-f58e-b4169acdb4e3</id> <content>time</content> </object> <target> <objectType>conceptMap</objectType> <id>4b8f69e3-2914-3a1a-454e-f4c157734bd1</id> <displayName>my first concept map</displayName> </target> <generator> <objectType>application</objectType> <url>http://www.golabz.eu/content/go-lab-concept-mapper</url> <id>c9933ad6-dd4a-6f71-ce84-fb1676ea3aac</id> <displayName>ut.tools.conceptmapper</displayName> </generator> <provider> <objectType>ils</objectType> <url>http://graasp.epfl.ch/metawidget/1/b387b6f</url> <id>10548c30-72bd-0bb3-33d1-9c748266de45</id> <displayName>unnamed ils</displayName> </provider> </log>

I found a method here at Stackoverflow which deals with that (How to retrieve element value of XML using Java?):

protected String getString(String tagName, Element element) {
    NodeList list = element.getElementsByTagName(tagName);
    if (list != null && list.getLength() > 0) {
        NodeList subList = list.item(0).getChildNodes();

        if (subList != null && subList.getLength() > 0) {
            return subList.item(0).getNodeValue();
        }
    }

    return null;
}

My problem is that I don't know how to get a specific ID (or the value of an other element) with that method WITHOUT using explicit pre-defined methods (I want to pass the ID I look for in the method-head itself). If I use getString("id", document.getDocumentElement) it returns just the "e1b8948f-321e-78ca-d883-80500aae71b5"-ID. What to do if I want to get the ID "a1ad6ace-c722-ffa9-f58e-b4169acdb4e3" which is a subnode from <object>?

Community
  • 1
  • 1
X-Fate
  • 323
  • 4
  • 13

1 Answers1

1

You can use an XPath expression for this.

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression xPathExpression = xPath.compile("//object/id");

// this should return one "id" node
NodeList idNodelist = (NodeList) xPathExpression.evaluate(document, XPathConstants.NODESET);
Node idNode = idNodelist.item(0);
System.out.println(idNode.getTextContent());
M A
  • 71,713
  • 13
  • 134
  • 174
  • Never heard of XPath before. How can I access to the value within? If I write `idNodeList.item(0).getNodeValue()` it just returns "null". – X-Fate Oct 29 '14 at 19:41
  • @X-Fate Updated. The text you want to retrieve is the child node of the "id" element node. – M A Oct 29 '14 at 19:48
  • Great! With `getTextContent` the value is returned. Thanks! Problem solved... I guess... :p – X-Fate Oct 29 '14 at 19:48
  • Yes you can use that as well. – M A Oct 29 '14 at 19:49