我尝试从XML中提取类似于以下内容并存储在Oracle 10g表中的值:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" ...">
<organizations>
<organization identifier="***"><item identifier="_745"><item identifier="_9700"><imsss:sequencing><imsss:scoreAndRollup isCompletionRolledUp="false" isMasteryRolledUp="false" isScoreRequired="true" scoreRollupWeight="1.0"/></organization>
</organizations>
<resources/>
</manifest>
我尝试使用的查询是:
select xmltype(t.xml).extract('/manifest/organizations/organization').getStringVal() from BLAxml t
基础表中xml列的数据类型是CLOB。
不幸的是,每次运行此查询时,它都会返回值的空字符串,而不是XML语句的这一部分的内容。我指向的XML的哪个部分似乎并不重要,它给了我一个空字符串。
非常感谢任何帮助。谢谢。
答案 0 :(得分:0)
您的XML源具有默认命名空间:
xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
这意味着文件中的所有无前缀元素都绑定到该命名空间。
在XPath中,必须为元素添加前缀才能成为命名空间的一部分。如果提供了默认命名空间,则它依赖于您的宿主语言将其绑定到XPath。您总是有两种选择:
我不确定你是如何在PL / SQL中处理这个问题的,但根据the documentation,你应该能够做到这样的事情:
extract('/manifest/organizations/organization/item[2]/@identifier',
'xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"')
如果没有注册命名空间,如果匹配所有元素仍然可以提取数据,并通过匹配本地名称来限制它们:
extract('/*[local-name()="manifest"]/*[local-name()="organizations"]/*[local-name()="organization"]/*[local-name()="item"][2]/@identifier')