【问题标题】:How to generate xml with illegal character in tag如何在标签中生成带有非法字符的xml
【发布时间】:2017-10-05 10:24:04
【问题描述】:

我正在尝试从我的表数据生成 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 中做到这一点?

【问题讨论】:

  • 你总是有'&'?
  • @YogeshSharma - 是的,&amp; 总是会出现在列名中
  • 我认为所有答案都是有用的,但您只需创建一个包含上述数据的 xml 文件然后在您的浏览器中运行(即,Chrome,...)它会给出什么输出?

标签: sql sql-server xml tsql xpath


【解决方案1】:

也许你可以改成 XML raw:

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

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

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

【讨论】:

    【解决方案2】:

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

    XML 是一种可互换的格式,可以转换为(半)人类可读的 string 格式。需要将 XML 编码为字符串,必须将一些字符定义为 magic,即&lt;, &gt; and &amp;。为了不干扰 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')
    

    【讨论】:

      【解决方案3】:

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

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

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


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

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

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

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

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

      【讨论】:

      • 感谢您的想法。但结果应该是xml 而不是字符串。所以我们不能在标签中有&amp;。无法正确处理标签中的非法字符..
      • @Pரதீப் 我不认为 SQL-Server 会以任何方式输出无效的 XML……但也许我错了。
      • 我对此做了很多研究。看起来这是不可能的。我只需要确认 :) 让我们等待某人确认或提出答案。
      • 您可以将结果输出到带有exec xp_cmdshell 'bcp ....' 的文件中。 - 但它仍然是无效的 XML。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      相关资源
      最近更新 更多