Oracle XML提取路径

时间:2017-02-17 10:29:27

标签: xml oracle extract

我一直在尝试使用oracle从xml中提取数据。 这是我的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

结果我得到null。我猜测路径是在创造问题,因为当我只使用&#34; // text()&#34;作为路径,我得到结果中的数据。 我需要帮助来解决这个问题。感谢。

3 个答案:

答案 0 :(得分:2)

<config xmlns="http://www.xfa.org/schema/xci/1.0/">这是问题所在。 Defult名称空间更改为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/"')

答案 1 :(得分: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

答案 2 :(得分: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而不是extract:

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