2017-02-17 68 views
0

我一直在嘗試使用oracle從xml中提取數據。 這是我的xml:Oracle XML提取路徑

<?xml version="1.0" encoding="UTF-8"?> 
<?xfa generator="XFA2_4" APIVersion="3.6.12227.0"?> 
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/"> 
    <config xmlns="http://www.xfa.org/schema/xci/1.0/"> 
     </agent name="designer"> 
     <destination>pdf</destination> 
     <pdf> 
      <fontInfo /> 
     </pdf> 
     </agent> 
     <present> 
     <pdf> 
      <version>1.65</version> 

我想提取關於版本信息。

Select XMLTYPE (blob_to_clob(datoteka)).extract('//xdp:xdp/config/present/pdf/version/text()','xmlns:xdp="http://ns.adobe.com/xdp/"').getstringval() AS Verzija from datoteka 

作爲結果,我得到空值。我猜路徑正在創建問題,因爲當我使用「// text()」作爲路徑時,我在結果中獲取數據。 我需要關於如何解決這個問題的幫助。謝謝。

回答

2

<config xmlns="http://www.xfa.org/schema/xci/1.0/">這是問題。模糊名稱空間更改爲http://www.xfa.org/schema/xci/1.0/" 提取必須更改爲。

extract('//xdp:xdp/config/present/pdf/version/text()','xmlns="http://www.xfa.org/schema/xci/1.0/" xmlns:xdp="http://ns.adobe.com/xdp/"') 
+0

這是非常有益的。謝謝。 – acolak

0

您在發佈的XML中也有錯誤(</agent name="designer">)。

這裏是工作的代碼

Select XMLTYPE('<?xml version="1.0" encoding="UTF-8"?> 
<?xfa generator="XFA2_4" APIVersion="3.6.12227.0"?> 
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/"> 
    <config xmlns="http://www.xfa.org/schema/xci/1.0/"> 
    <agent name="designer"> 
     <destination>pdf</destination> 
     <pdf> 
     <fontInfo /> 
     </pdf> 
    </agent> 
    <present> 
     <pdf> 
     <version>1.65</version> 
     </pdf> 
    </present> 
    </config> 
</xdp:xdp>').extract('//xdp:xdp/config/present/pdf/version/text()','xmlns="http://www.xfa.org/schema/xci/1.0/" xmlns:xdp="http://ns.adobe.com/xdp/"') 
     .getstringval() AS Verzija 
    from dual 
0

正如@Arkadiusz已經提到你需要包括默認的命名空間以及xdp

select XMLType(blob_to_clob(datoteka)).extract('/xdp:xdp/config/present/pdf/version/text()', 
    'xmlns:xdp="http://ns.adobe.com/xdp/" xmlns="http://www.xfa.org/schema/xci/1.0/').getstringval() 
    as verzija 
from datoteka; 

VERZIJA 
---------- 
1.65 

(對修改後的XML運行;固定開口劑標籤,並添加了缺少的結束標籤)。

你也可以使用一個XMLQUERY,而不是提取物:

select XMLQuery('declare namespace xdp="http://ns.adobe.com/xdp/"; (: :) 
    declare default element namespace "http://www.xfa.org/schema/xci/1.0/"; (: :) 
    /xdp:xdp/config/present/pdf/version/text()' 
    passing XMLType(blob_to_clob(datoteka)) 
    returning content) as verzija 
from datoteka; 

VERZIJA 
---------- 
1.65 

如果你的XML文檔可能有多個版本,您可以使用XMLTable的檢索他們都:

select x.verzija 
from datoteka d 
cross join xmltable(xmlnamespaces('http://ns.adobe.com/xdp/' as "xdp", 
    default 'http://www.xfa.org/schema/xci/1.0/'), 
    '/xdp:xdp/config/present/pdf' 
    passing XMLType(blob_to_clob(datoteka)) 
    columns verzija path 'version' 
) x; 

VERZIJA 
---------- 
1.65