2012-04-02 86 views
2

我正嘗試從位於Oracle表的XMLTYPE列中的xml元素中提取值。我試圖提取的xml元素有一個爲其定義名稱空間的父項。 的XML看起來是這樣的:在Oracle中選擇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

由於a元素沒有命名空間,您可以先提取其子元素不會在功能使用的命名空間,然後提取從b與命名空間的價值:
嘗試:

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

它的工作原理。謝謝,我永遠不會想到這個。 – 2012-04-02 12:01:11

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

這可能對更復雜的結構有幫助... – 2012-04-02 12:05:27

+0

我會補充說,這是現在更好的現代解決方案,因爲提取/提取值已折舊。 – REW 2015-06-08 20:16:04

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

當默認命名空間的變化,指定名稱空間的一種方法是寫通配符(「*」)和本地名稱()namespace-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