我运行下面的代码有错误,因为它有“&”签名,不能转换它。
结果应显示“testing&”。但是,如果我将xml位更改为“testing&”有用。我需要一种方法来替换它,以便它不会出错。
const ComponentType &t = m_fsm.state_cast<const ComponentType &>();
答案 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,您会发现&
被发现为&
。在使用value()
阅读此内容时,会再次隐式地重新编码。
您不应该开始采用自己的REPLACE
方法。第二天有人输入了<
或>
或其他不受支持的字符,您又遇到了同样的麻烦。
答案 1 :(得分:1)
&
是XML中的保留/特殊字符。它应该是&amp; amp;并删除&amp; amp;;
作为下一个:
Declare @Request XML = null
If @Request IS NULL
BEGIN
SET @Request = '
<Request>
<ProductRequest>
<ProductName>testing &</ProductName>
</ProductRequest>
</Request>'
END
select @Request.value ('(//ProductName)[1]','nvarchar(100)')
答案 2 :(得分:0)
您需要在&符号的XML字符串中指定实体引用&
:
DECLARE @Request XML = NULL;
IF @Request IS NULL
BEGIN
SET @Request = '
<Request>
<ProductRequest>
<ProductName>testing &</ProductName>
</ProductRequest>
</Request>';
END;
SELECT @Request.value ('(//ProductName)[1]','nvarchar(100)');
请参阅https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references