3

I'm trying to use XPath to parse an XML string but I am getting only null values back. Does anyone have an idea where I might be going wrong in the code shown below?

public static void main(String[] args) {
    String content = "<imagesXML><Images><Image><ImageUID Scope='Public' Type='Guid' Value='{7f2535d0-9a41-4997-9694-0a4de569e6d9}'/><CorbisID Scope='Public' Type='String' Value='42-15534232'/><Title Scope='Public' Type='String' Value='Animal'/><CreditLine Scope='Public' Type='String' Value='© Robert Llewellyn/Corbis'/><IsRoyaltyFree Scope='Public' Type='Boolean' Value='False'/><AspectRatio Scope='Public' Type='String' Value='1.500000'/><URL128 Scope='Public' Type='String' Value='http://cachens.corbis.com/CorbisImage/thumb/15/53/42/15534232/42-15534232.jpg'/></Image></Images></imagesXML>";
    InputSource source = new InputSource(new StringReader(content));
    XPath xPath = XPathFactory.newInstance().newXPath();
    NodeList list = null;
    try {
        list = (NodeList) xPath.evaluate("//URL128[@Value]", source,
                XPathConstants.NODESET);
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
    for (int i = 0; i < list.getLength(); i++) {
        System.out.println(list.item(i));
    }
}

The output from System.out is 'value=[URL128: null]', but it should be the URL I am trying to extract: http://cachens.corbis.com/CorbisImage/thumb/15/53/42/15534232/42-15534232.jpg.

Any help appreciated, thanks.

2 Answers 2

5

What if you try changing your XPath evaluation statement from this:

list = (NodeList)xPath.evaluate("//URL128[@Value]", 
    source, XPathConstants.NODESET);

to this:

list = (NodeList) xPath.evaluate("//URL128/@Value", 
    source, XPathConstants.NODESET);
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks, that worked. I get Value="cachens.corbis.com/CorbisImage/thumb/15/53/42/15534232/…" Is there any way to remove the Value= part using the XPath evaluation?
ahhh, got it System.out.println(list.item(i).getTextContent());
@c12: Sure, you could do that with String#replace or String#replaceAll if you know that it will not be represent in the body of the String. -- never mind, your way is better!
1

Note:

  • The expression //URL128[@Value] returns a list of all URL123 elements having a Value attribute
  • The expression //URL128/@Value returns a list of the Value attributes from each URL128 element in the source

Neither of these lists contain strings; they contain DOM types. You've got only one URL128 element in your source, yet you're asking for a NodeList. You could simplify by using the following:

String url = xPath.evaluate("//URL128/@Value", source);

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.