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.
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']
You need to provide a NamespaceContext
and namespace your expression. See here for an example.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With