在Oracle中选择xml元素值

时间:2012-04-02 11:24:25

标签: xml oracle namespaces extract

我正在尝试从位于Oracle表的XMLTYPE列中的xml元素中提取值。我想要提取的xml元素具有为其定义命名空间的父元素。 xml看起来像:

<a>
  <b xmlns="urn:www.someSite.com/myModel">
    <c>my value</c>
  </b>
</a>

如果我想提取“a”元素的内容,则会正确返回其上下文:

SELECT Extract(myColumn, '/a') FROM myTable;

但是为了返回“c”元素的内容,我没有成功找到任何版本。以下说明不起作用:

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;

任何人都能帮助我,使用在这种情况下可行的提取语句吗?

4 个答案:

答案 0 :(得分:5)

select a.*
from   XMLTABLE(
         XMLNAMESPACES('urn:www.someSite.com/myModel' AS "ns"),
         '/*'
         PASSING my.myColumn           
         COLUMNS
           val  VARCHAR2(2000)   PATH '/a/ns:b/ns:c'
       ) a, myTable my;

答案 1 :(得分:4)

由于a元素没有命名空间,您可以先在函数中不使用命名空间的情况下提取其子元素,然后使用命名空间从b中提取值:
试试:

select extract(extract(myColumn, 'a/*'),
               'b/c/text()',
               'xmlns=urn:www.someSite.com/myModel') 
  from myTable

答案 2 :(得分:0)

当默认命名空间发生变化时,指定命名空间的一种方法是编写通配符(&#39; *&#39;)和 local-name()命名空间-uri() XPath函数。

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

答案 3 :(得分:-1)

SELECT XMLAGG(XMLELEMENT(E,ename||',')).EXTRACT('//text()') "Result"
FROM   emp