In Firefox JavaScript console:
parser = new DOMParser();
foo = parser.parseFromString('<foo></foo>', "text/xml");
res = foo.evaluate("/foo", foo, null, 0, null);
res.iterateNext();
> [object Element]
foo = parser.parseFromString('<foo xmlns="http://foo.bar.baz/quux"></foo>', "text/xml");
res = foo.evaluate("/foo", foo, null, 0, null);
res.iterateNext();
> null
res = foo.evaluate("*[1]", foo, null, 0, null);
res.iterateNext();
> [object Element]
If an XML document doesn't contain an xmlns, it gets parsed and queried correctly. If it does, we are not able to query by tag and attribute names anymore. However, querying with wildcards and indexes does work. The same is observed in Chrome. Creating and using default namespace resolver, as well as custom one, doesn't help. Any suggestions?
You have to do two things when dealing with namespaces.
ns
-- better go with something more descriptive in real world code.evaluate(...)
.Putting everything together, your code would look like this:
parser = new DOMParser();
foo = parser.parseFromString('<foo xmlns="http://foo.bar.baz/quux"></foo>', "text/xml");
res = foo.evaluate("/ns:foo", foo, function(prefix) {
if (prefix === 'ns') {
return 'http://foo.bar.baz/quux';
} else {
return null
}
}, 0, null);
res.iterateNext();
Which returns as expected:
<foo xmlns="http://foo.bar.baz/quux"></foo>
Your third query has results because you're using the wildcard matcher *
which ignores namespaces. An alternative XPath expression without registering a namespace, but using the wildcard matcher would be
//*[local-name() = 'foo']
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