如何转换存储在VARCHAR中的xml文本并使用XQUERY表达式进行选择 [英] How to convert xml text stored in a VARCHAR and select using XQUERY expression

查看:81
本文介绍了如何转换存储在VARCHAR中的xml文本并使用XQUERY表达式进行选择的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将xml文档以文本形式存储在VARCHAR列中.我想将文本转换为XML文档,以便在文档上执行XQUERY选择.

I have xml documents stored as text in a VARCHAR column. I'd like to convert the text to XML documents in order to perform XQUERY selects on the documents.

示例文档如下:

<a>
   <b foor="bar"/>
   <c/>
</a>

我的查询如下:

SELECT XMLQUERY('//c' PASSING 
  XMLCAST('<a><b foor="bar"/><c/></a>' AS XML)) 
FROM SYSIBM.sysdummy1

但是我没有返回一个元素,而是得到了以下错误消息:

But instead of returning a element I get the following error message:

SQL错误[10507]:轴步骤中的上下文项必须是节点.SQLCODE = -16012,SQLSTATE = 10507

SQL Error [10507]: The Context item in an axis step must be a node. SQLCODE=-16012, SQLSTATE=10507

如何使它正常工作?

========================================
更新#1:以防万一有人偶然发现相同的问题.至少在我的环境中,下面的查询起作用了,但是我没有返回匹配的xml节点的文本,而是仅将列显示为值"[le]".我不得不将结果投射到例如VARCHAR XMLCAST()以获取XML作为文本.因此,我将Stavr00的查询更改为:

===========================================
Update #1: Just in case anyone stumbles upon the same problem. At least in my environment the queries below work but instead of returning the text of the matching xml nodes I only got columns showing up as value "[le]". I had to cast the result to e.g. VARCHAR XMLCAST() to get the xml as text. So I changed Stavr00's query to:

SELECT 
    XMLCAST(XMLQUERY('string(/a/b/@foo)' PASSING X) AS VARCHAR(20)) 
FROM (
SELECT xmlparse('<a><b foo="bar"/><c/></a>')
FROM sysibm.sysdummy1
) AS X(X)

推荐答案

同意@data_henrik.但是,我建议使用CTE嵌套来解析XML仅一次:

Agree with @data_henrik. However I recommend using CTE nesting as to parse XML only once:

SELECT 
    XMLQUERY('string(/a/b/@foo)' PASSING X) 
   ,XMLQUERY('//c' PASSING X)
FROM (
SELECT xmlparse('<a><b foo="bar"/><c/></a>')
FROM sysibm.sysdummy1
) AS X(X)

这篇关于如何转换存储在VARCHAR中的xml文本并使用XQUERY表达式进行选择的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆