I'm trying to use XPath to find all elements that have an element in a given namespace.
For example, in the following document I want to find the foo:bar
and doodah
elements:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com">
<foo:bar quux="value">Content</foo:bar>
<widget>Content</widget>
<doodah foo:quux="value">Content</doodah>
</root>
I know I can use the following XPath expression to load all attributes from a given namespace:
"//@*[namespace-uri()='http://foo.example.com']"
However:
Is it possible to get what I want, or do I have to gather the attributes and calculate the unique set of elements they correspond to?
XPath queries are aware of namespaces in an XML document and can use namespace prefixes to qualify element and attribute names. Qualifying element and attribute names with a namespace prefix limits the nodes returned by an XPath query to only those nodes that belong to a specific namespace.
The namespace can be defined by an xmlns attribute in the start tag of an element. The namespace declaration has the following syntax. xmlns:prefix="URI".
Use:
//*[namespace-uri()='yourNamespaceURI-here' or @*[namespace-uri()='yourNamespaceURI-here'] ]
the predicate two conditions are or-ed with the XPath or
operator.
The XPath expression thus selects any element that either:
I'm not sure if this is what you mean, but by only deleting one char in your XPath you get all elements in a certain namespace:
//*[namespace-uri()='http://foo.example.com']
You could try
//*[namespace-uri()='http://foo.example.com' or @*[namespace-uri()='http://foo.example.com']]
It will give you element foo:bar and element doodah (if you change tal:quux
to foo:quux
in your XML-data):
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com" xmlns:tal="xxx">
<foo:bar quux="value">Content</foo:bar>
<widget>Content</widget>
<doodah foo:quux="value">Content</doodah>
</root>
Is that what you want?
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