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



在SQL Server 2014中,我尝试在XML数据类型上使用"modify"方法添加具有属性(包含回车)的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>

空格字符可以由解析器规范化。

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

虽然您的XML是有效的,但空白的具体呈现方式取决于实现。正如你所看到的,crlf被替换成了一个空格。

请注意

通常,XML与内容结构/元数据的工作方式不同

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

在XML的设计中,从来没有想过属性会显示在最终用户设备上,我建议您只为这个最终用户内容制作另一个标签。

第3.3.3节,属性值归一化

在将属性的值传递给应用程序或检查有效性后,XML处理器必须规范化属性通过应用下面的算法或使用其他方法以便传递给应用程序的值与由算法产生。

  1. 所有换行符必须在#xA的输入上进行规范化,如2.11行尾处理中所述,因此该算法的其余部分对以这种方式规范化的文本进行操作
  2. 从一个由空字符串组成的规范化值开始
  3. 对于未规范化属性值中的每个字符、实体引用或字符引用,从第一个和继续到最后,执行以下操作:

    对于字符引用,请将引用的字符附加到规范化值。对于实体引用,递归地将此算法的步骤3应用于实体的替换文本。对于空白字符(#x0,#xD,#xA,#x9),将空白字符( )附加到归一化值。对于另一个字符,请将该字符附加到规范化值。如果属性类型不是CDATA,则XML处理器必须通过丢弃任何前导和尾部空格(#x20)字符,并通过替换一个空格(#x20)的空格(#x200)字符序列性格

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

最新更新