如何在标记中生成带有非法字符的xml

时间:2017-10-05 10:24:04

标签: sql sql-server xml tsql xpath

我试图从我的表数据中生成xml。列名之一有&(非法字符)。因此,生成xml时会出现以下错误。

  

消息6850,级别16,状态1,行955列名称'a& b'包含   FOR XML要求的无效XML标识符; '&'(0x0026)是   错误的第一个角色。

这是一个例子

SELECT [a&b] ='A'
FOR xml path(''), root('head') 

预期结果:

<head>
  <a&b>A</a&b>
</head>

有没有办法在sql中执行此操作?

3 个答案:

答案 0 :(得分:3)

也许您可以更改为XML raw:

SELECT [a&b] ='A'
FOR xml raw, root('head') 

这将改变XML的结构,但它不会引发错误,而且它是格式良好的XML。

<head>
  <row a_x0026_b="A" />
</head>

答案 1 :(得分:2)

您可以使用特殊字符串执行REPLACE,该字符串不会出现在XML数据中:

DECLARE @myXML varchar(MAX)
SET @myXML=(SELECT 'a.123ASPECIALSTRING123.b'='A' FOR xml path(''), root('head'))
SELECT REPLACE(@myXML, '.123ASPECIALSTRING123.', '&');

测试示例:http://rextester.com/BYJYY1222

但请注意:&不是XML元素名称的允许字符。
意味着结果将是一个格式错误的XML。

  

XML元素必须遵循以下命名规则:

     
      
  • 元素名称区分大小写
  •   
  • 元素名称必须以字母或下划线开头
  •   
  • 元素名称不能以字母xml(或XML,或Xml等)
  • 开头   
  • 元素名称可以包含字母,数字,连字符,下划线和句点
  •   
  • 元素名称不能包含空格
  •   
     

可以使用任何名称,不保留任何单词(xml除外)。

来源:https://www.w3schools.com/XML/xml_elements.asp

答案 2 :(得分:2)

您的预期结果肯定是无效的xml:

XML应该是一种可互换的格式,可以转换为(半) - 人类可读字符串格式。将XML编码为字符串的必要性必须将某些字符定义为 magic ,即<, > and &。必须转义这些字符,以免干扰XML的标记:

DECLARE @tbl TABLE([ab] NVARCHAR(100));
INSERT INTO @tbl VALUES(N'forbidden characters will be escaped &><');

SELECT * FROM @tbl FOR XML PATH('root');

结果

<root>
  <ab>forbidden characters will be escaped &amp;&gt;&lt;</ab>
</root>

在阅读XML时,适当的工具会自动重新转义这些实体。

但元素和属性的节点受到更多限制!此表包含错误列

DECLARE @tbl2 TABLE([a&b] NVARCHAR(100));
INSERT INTO @tbl2 VALUES(N'dummy');
SELECT * FROM @tbl2 FOR XML RAW;

FOR XML PATH会抛出错误,但FOR XML RAW将会回复:

<row a_x0026_b="dummy" />

问题是,这些替换不会重新编码

DECLARE @xml XML=(SELECT * FROM @tbl2 FOR XML RAW);
SELECT @xml.value(N'local-name((/row/@*)[1])',N'nvarchar(max)')

属性的名称将返回为a_x0026_b

我的第一个建议是:永远不要那样做!不要在XML标记中使用禁用字符!

您可能会使用类似

的内容
SELECT column1
      ,column2
      ,[My&bad<column] AS SomeOtherName
      ,column4
FROM myTable
FOR XML PATH('root')