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

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.