通过XML解析SQL中的字符错误

时间:2016-11-15 13:11:31

标签: sql-server xml tsql xml-parsing special-characters

我运行下面的代码有错误,因为它有“&”签名,不能转换它。

结果应显示“testing&”。但是,如果我将xml位更改为“testing&”有用。我需要一种方法来替换它,以便它不会出错。

const ComponentType &t = m_fsm.state_cast<const ComponentType &>();

3 个答案:

答案 0 :(得分:2)

你可能正在寻找这个:

Declare @Request XML = null
If @Request IS NULL 
BEGIN
    SET @Request = (SELECT 'testing &' AS ProductName FOR XML PATH('ProductRequest'),ROOT('Request'));
END 

select @Request.value ('(//ProductName)[1]','nvarchar(100)') 

一些背景知识:

XML不仅仅是一些带有额外字符的文字。永远不应该只通过键入(如在您的情况下)或通过字符串连接(经常看到)生成XML。使用正确的方法来生成您的XML ,并隐式解决所有编码问题。

查看生成的XML,您会发现&被发现为&amp;。在使用value()阅读此内容时,会再次隐式地重新编码。

您不应该开始采用自己的REPLACE方法。第二天有人输入了<>或其他不受支持的字符,您又遇到了同样的麻烦。

答案 1 :(得分:1)

&是XML中的保留/特殊字符。它应该是&amp; amp;并删除&amp; amp;;

之间的空格

作为下一个:

Declare @Request XML = null
If @Request IS NULL 
BEGIN
    SET @Request = '
                    <Request>  
                       <ProductRequest>
                    <ProductName>testing &amp;</ProductName>
                      </ProductRequest>
                     </Request>'
END 

select @Request.value ('(//ProductName)[1]','nvarchar(100)') 

答案 2 :(得分:0)

您需要在&符号的XML字符串中指定实体引用&amp;

DECLARE @Request XML = NULL;
IF @Request IS NULL 
BEGIN
    SET @Request = '
                    <Request>  
                       <ProductRequest>
                    <ProductName>testing &amp;</ProductName>
                      </ProductRequest>
                     </Request>';
END; 

SELECT @Request.value ('(//ProductName)[1]','nvarchar(100)');

请参阅https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references