I am trying to extract a value from an xml element, located in an XMLTYPE column in an Oracle Table. The xml element which I am trying to extract have a parent for which a namespace is defined. The xml looks something like:
<a>
<b xmlns="urn:www.someSite.com/myModel">
<c>my value</c>
</b>
</a>
If I want to extract the content of the "a" element, its context is correctly returned:
SELECT Extract(myColumn, '/a') FROM myTable;
But for returning the content of the "c" element I didn't succeed to find any version to work. The following instructions does not work:
SELECT Extract(myColumn, '/a/b/c') FROM myTable;
SELECT Extract(myColumn, '/a/b/c', 'xmlns="urn:www.someSite.com/myModel"') FROM myTable;
SELECT Extract(myColumn, '/a/b/c', 'urn:www.someSite.com/myModel') FROM myTable;
Can anybody help me, with the extract statement that would work in this case?
Since the
a
element does not have the namespace, you can first extract its child elements without using namespaces in the function, and then extract the value from theb
with the namespace:Try:
When the default namespace changes, one way to specify namespaces is to write the wildcard character ('*') and the local-name() and namespace-uri() XPath functions.
select extract(myColumn, '/a/*[local-name()='b' and namespace-uri()='urn:www.someSite.com/myModel']/*[local-name()='c' and namespace-uri()='urn:www.someSite.com/myModel']') from myTable