我一直在尝试使用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;作为路径,我得到结果中的数据。 我需要帮助来解决这个问题。感谢。
答案 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