PLSQL从XML读取值?

时间:2011-02-16 12:26:33

标签: xml plsql plsqldeveloper

我有一个包含XML代码的字符串,我想从PL / SQL中将一个值提取到一个变量。

XML非常简单,与此不同:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <SOAProxyResponse xmlns="http://tempuri.org/">
            <SOAProxyResult>
                There is 23142 Files!
            </SOAProxyResult>
        </SOAProxyResponse>
    </s:Body>
</s:Envelope

如何将上面示例中的“有23142个文件!”值变为变量?

2 个答案:

答案 0 :(得分:9)

您可以使用EXTRACTVALUE功能获取此值。此函数需要两个或三个参数:

  • 包含XML文档的XMLTYPE对象。
  • 一个XPath表达式,用于标识XML中我们想要的值的位置。
  • (可选)一个额外的字符串,用于将名称空间前缀绑定到URI。

在下面的查询中,我将上面提到的XML作为字符串,并从中创建了XMLTYPE对象。然后我使用EXTRACTVALUE来获取您要求的值:

SELECT EXTRACTVALUE(XMLTYPE(
    '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <SOAProxyResponse xmlns="http://tempuri.org/">
                <SOAProxyResult>
                    There is 23142 Files!
                </SOAProxyResult>
            </SOAProxyResponse>
        </s:Body>
    </s:Envelope>'), '//SOAProxyResult', 'xmlns="http://tempuri.org/"') AS result
  FROM dual;

XPath表达式//SOAProxyResult仅返回文档中的所有SOAProxyResult元素。 EXTRACTVALUE的第三个参数将默认命名空间绑定到http://tempuri.org/。这是必要的,因为XML文档中的SOAProxyResult元素位于此命名空间内。

如果我运行此查询,我会得到以下输出:

RESULT
--------------------------------------------------------------------------------

                    There is 23142 Files!

从这里开始,希望将此查询的结果放入变量中是一项微不足道的修改。

答案 1 :(得分:1)

前一段时间甲骨文杂志上发表了一篇很好的文章 - 这可能会对你有所帮助:

http://www.oracle.com/oramag/oracle/01-jul/o41xml.html

我们在这里使用的另一件事是XMLType API,但当然这取决于您存储/保存XML数据的方式:

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96616/arxml24.htm