在SQL Server 2014中,我尝试使用' modify'添加带有属性(包含回车符)的XML元素。 XML数据类型的方法。 回车被删除了 - 为什么会这样?
示例:
declare @xmldata xml
select
@xmldata = '<root><child myattr="carriage returns 
 are not a problem"></child></root>'
set
@xmldata.modify('insert <child>modifying text with carriage returns works
ok</child> after (//child)[1]')
set
@xmldata.modify('insert <child myattr="but not
attribute values... why is that?"></child> after (//child)[2]')
select @xmldata
结果:
<root>
<child myattr="carriage returns 
 are not a problem" />
<child>modifying text with carriage returns works
ok</child>
<child myattr="but not attribute values... why is that?" />
</root>
答案 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处理器必须规范化属性 通过应用下面的算法,或通过使用一些其他方法的值 这样传递给应用程序的值与该值相同 由算法产生。
- 所有换行必须按照2.11行尾处理中的描述对#xA的输入进行归一化,因此该算法的其余部分 对以这种方式规范化的文本进行操作。
- 以包含空字符串的标准化值开头。
- 醇>
对于非标准化属性值中的每个字符,实体引用或字符引用,以第一个和第一个开头 继续到最后,执行以下操作:
对于字符引用,将引用的字符附加到规范化值。 对于实体引用,递归地将此算法的步骤3应用于实体的替换文本。 对于空格字符(#x20,#xD,#xA,#x9),请在标准化值后附加空格字符(#x20)。 对于另一个字符,将字符附加到规范化值。 如果属性类型不是CDATA,那么XML处理器必须通过丢弃any来进一步处理规范化的属性值 前导和尾随空格(#x20)字符,并通过替换 单个空格(#x20)的空格序列(#x20) 字符。
XML规范要求将属性中的CR / LF转换为单个空格。