如何使用&amp ;;拉出XML标签并分配给另一个XML字段

时间:2016-05-17 20:40:39

标签: sql-server xml xquery

为愚蠢的问题道歉,但我搜索了但仍然无法找到。 (如果我只是在搜索错误的条款,添加评论,我会删除它并找到它)

长话短说:现有代码使用此代码。我们用一些我们编写的代码来扼制我们从源数据重新创建的一些XML记录。我们将其缩小到我们的代码正在转换的事实。到&,但这导致以下查询失败,我们不明白为什么。我们正在使用一个粗糙的转换来替换&作为一个bandaid以使其正常工作,但我宁愿让它正常工作。

这是我的代码。没有&它就可以了。有了它,我得到'非法名字'。为什么?我正在将值提取为文本,即blah & blah

DECLARE @xml_doc XML, @xmlfirst XML
SET @xml_doc= '<A><B><C>blah &amp; blah</C></B></A>'
select TOP 1 CAST (X.Y.value('./C[1]', 'varchar(max)') as xml)
    FROM @xml_doc.nodes('/A/B')X(Y)

1 个答案:

答案 0 :(得分:4)

解释

X.Y.value('(./C)[1]', 'varchar(4000)')&amp;解码回&(这是值方法的行为)。这意味着X.Y.value('(./C)[1]', 'varchar(max)')会返回blah & blah。然后将blah & blah转换为XML会生成此错误&#34;错误&#34; / exception因为blah & blah不是有效的XML(在有效的XML中,&应编码为&amp;)。

解决方案#1:如果您想获取编码的内部文本(&amp;)AS XML

SELECT  X.Y.query('./C/text()')
FROM    @xml_doc.nodes('/A/B')X(Y)

返回blah &amp; blah

解决方案#2:如果你想获得(&

的解码内部文本
SELECT  X.Y.value('./C[1]', 'VARCHAR(MAX)')
FROM    @xml_doc.nodes('/A/B')X(Y)

返回blah & blah