为什么在SQL Server中修改XML属性时会删除回车?

时间:2015-11-20 14:57:58

标签: sql sql-server carriage-return sqlxml

在SQL Server 2014中,我尝试使用' modify'添加带有属性(包含回车符)的XML元素。 XML数据类型的方法。 回车被删除了 - 为什么会这样?

示例:

declare @xmldata xml

select 
    @xmldata = '<root><child myattr="carriage returns &#xD;&#xA; are not a problem"></child></root>'

set 
   @xmldata.modify('insert <child>modifying text with carriage returns works&#xD;&#xA;ok</child> after (//child)[1]')

set 
   @xmldata.modify('insert <child myattr="but not&#xD;&#xA;attribute values... why is that?"></child> after (//child)[2]')

select @xmldata

结果:

<root>
  <child myattr="carriage returns &#xD;&#xA; are not a problem" />
  <child>modifying text with carriage returns works
ok</child>
  <child myattr="but not attribute values... why is that?" />
</root>

2 个答案:

答案 0 :(得分:3)

空格字符可以通过解析器进行规范化。

cf http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize

虽然您的XML有效,但呈现的白色空间究竟与实现有关。如你所见,crlf被一个空格所取代。

  

请注意

     

一般情况下,XML与内容结构/元数据

的工作方式不同      

属性值被视为结构,标签之间的数据被视为内容。

     

在XML的设计中,从未期望在最终用户设备上显示属性,我建议您为此最终用户内容制作另一个标记。

答案 1 :(得分:3)

Section 3.3.3, Attribute-Value Normalization

  

在将属性的值传递给应用程序之前或   检查有效性,XML处理器必须规范化属性   通过应用下面的算法,或通过使用一些其他方法的值   这样传递给应用程序的值与该值相同   由算法产生。

     
      
  1. 所有换行必须按照2.11行尾处理中的描述对#xA的输入进行归一化,因此该算法的其余部分   对以这种方式规范化的文本进行操作。
  2.   
  3. 以包含空字符串的标准化值开头。
  4.   
  5. 对于非标准化属性值中的每个字符,实体引用或字符引用,以第一个和第一个开头   继续到最后,执行以下操作:

         

    对于字符引用,将引用的字符附加到规范化值。     对于实体引用,递归地将此算法的步骤3应用于实体的替换文本。     对于空格字符(#x20,#xD,#xA,#x9),请在标准化值后附加空格字符(#x20)。     对于另一个字符,将字符附加到规范化值。   如果属性类型不是CDATA,那么XML处理器必须通过丢弃any来进一步处理规范化的属性值   前导和尾随空格(#x20)字符,并通过替换   单个空格(#x20)的空格序列(#x20)   字符。

  6.   

XML规范要求将属性中的CR / LF转换为单个空格。