ibm123
ibm123

Reputation: 1254

XPath not working properly when the root tag got xmlns property

I'm trying to parse an xml file using XPath

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true); // never forget this!
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse(File);

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();
    XPathExpression expr 
     = xpath.compile("//PerosnList/List/Person");

It took me alot of time to see that it's not working cause the root element got xmlns attribute once i remove the attr it works fine!, how can i workaround this xlmns attr without deleting it from the file ?

The xml looks like this:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/vsDal.Entities">
.....
....
<PersonList>
...
<List>
<Person></Person>
<Person></Person>
<Person></Person>
</List>
</PersonList>
</Root>

Thanks.

Upvotes: 5

Views: 6871

Answers (2)

Mads Hansen
Mads Hansen

Reputation: 66723

The xmlns attribute is more than just a regular attribute. It is a namespace attribute which are used to uniquely qualify elements and attributes.

The PersonList, List, and Person elements "inherit" that namespace. Your XPath isn't matching because you are selecting elements in the "no namespace". In order to address elements bound to a namespace in XPath 1.0 you must define a namespace-prefix and use it in your XPath expression.

You could make your XPath more generic and just match on the local-name, so that it matches the elements regardless of their namespace:

//*[local-name()='PersonList']/*[local-name()='List']/*[local-name()='Person']

Upvotes: 10

McDowell
McDowell

Reputation: 108879

You need to provide a NamespaceContext and namespace your expression. See here for an example.

Upvotes: 8

Related Questions