我将xml文档存储为VARCHAR列中的文本。我想将文本转换为XML文档,以便对文档执行XQUERY选择。
示例文档如下所示:
<a>
<b foor="bar"/>
<c/>
</a>
我的查询如下:
SELECT XMLQUERY('//c' PASSING
XMLCAST('<a><b foor="bar"/><c/></a>' AS XML))
FROM SYSIBM.sysdummy1
但是我没有返回一个元素,而是收到以下错误消息:
SQL错误[10507]:轴步骤中的上下文项必须是节点。 SQLCODE = -16012,SQLSTATE = 10507
我怎样才能让它发挥作用?
===========================================
更新#1:
以防任何人遇到同样的问题。至少在我的环境中,下面的查询有效,但不是返回匹配的xml节点的文本,而是只显示列为#34; [le]&#34;的列。我不得不把结果投到例如VARCHAR XMLCAST()将xml作为文本。所以我将Stavr00的查询改为:
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)
答案 0 :(得分:1)
下面没有经过语法测试,但我建议使用XMLPARSE。它将字符串转换为XML,可以由XMLQUERY使用:
SELECT XMLQUERY('//c' PASSING
xmlparse(document '<a><b foor="bar"/><c/></a>'))
FROM sysibm.sysdummy1
那应该返回<c/>
。
答案 1 :(得分:1)
同意@data_henrik。但是,我建议使用CTE嵌套来仅解析XML一次:
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)