Home >Java >javaTutorial >How to Query XML with Namespaces using XPath in Java?
When working with XML that utilizes namespaces, XPath queries that disregard namespaces may result in incorrect matches. In scenarios where the XML elements are bound to a specific namespace, it becomes crucial to consider the namespace in XPath expressions.
The preferred approach is to declare a namespace prefix and explicitly reference it in your XPath queries. This enhances code readability and maintainability. For instance:
NamespaceContext namespaceContext = new NamespaceContext(); namespaceContext.addNamespace("x", "http://schemas.example.com/x"); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); xpath.setNamespaceContext(namespaceContext); NodeList nodes = (NodeList)xpath.evaluate("/x:workbook/x:sheets/x:sheet[1]", doc, XPathConstants.NODESET);
Alternatively, it's possible to construct an XPath expression that generically matches elements and uses predicates to filter results based on their local-name and namespace-uri. While this approach may be verbose, it allows for more flexibility:
XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); Item node = (Item)xpath.evaluate("//*[local-name()='workbook' and namespace-uri()='http://schemas.example.com/x']", doc, XPathConstants.NODE);
As a last resort, you can match elements based solely on their local-name, ignoring the namespace. However, this approach poses a risk of matching incorrect elements in scenarios where multiple vocabularies with similar local-names are present in the XML:
XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); Item node = (Item)xpath.evaluate("//*[local-name()='workbook']", doc, XPathConstants.NODE);
The above is the detailed content of How to Query XML with Namespaces using XPath in Java?. For more information, please follow other related articles on the PHP Chinese website!