使用XPath / extract查询Oracle表返回空字符串

时间:2014-06-11 02:25:01

标签: xml oracle xpath

我尝试从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的哪个部分似乎并不重要,它给了我一个空字符串。

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

您的XML源具有默认命名空间

xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"

这意味着文件中的所有无前缀元素都绑定到该命名空间。

在XPath中,必须为元素添加前缀才能成为命名空间的一部分。如果提供了默认命名空间,则它依赖于您的宿主语言将其绑定到XPath。您总是有两种选择:

  1. 注册命名空间(使用主机语言中的工具)
  2. 忽略命名空间(在XPath中使用通配符而不是元素名称)
  3. 1。注册命名空间

    我不确定你是如何在PL / SQL中处理这个问题的,但根据the documentation,你应该能够做到这样的事情:

    extract('/manifest/organizations/organization/item[2]/@identifier',  
            'xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"') 
    

    2。忽略命名空间

    如果没有注册命名空间,如果匹配所有元素仍然可以提取数据,并通过匹配本地名称来限制它们:

    extract('/*[local-name()="manifest"]/*[local-name()="organizations"]/*[local-name()="organization"]/*[local-name()="item"][2]/@identifier')