How to convert xml text stored in a VARCHAR and select using XQUERY expression

爷,独闯天下 提交于 2019-12-11 16:46:39

问题


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.

An example document looks like:

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

My query looks like:

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 Error [10507]: The Context item in an axis step must be a node. SQLCODE=-16012, SQLSTATE=10507

How can I get this to work?

===========================================
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)

回答1:


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)



回答2:


Not syntax-tested below, but I recommend to use XMLPARSE. It converts the string into XML which can be used by XMLQUERY:

SELECT XMLQUERY('//c' PASSING 
        xmlparse(document '<a><b foor="bar"/><c/></a>'))
FROM sysibm.sysdummy1

That should return <c/>.



来源:https://stackoverflow.com/questions/48922606/how-to-convert-xml-text-stored-in-a-varchar-and-select-using-xquery-expression

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!