LINQ to XML忽略属性中的换行符

时间:2012-07-13 08:37:23

标签: .net xml c#-4.0 linq-to-xml xml-attribute

根据这个问题:

Are line breaks in XML attribute values allowed?

XML属性中的换行符完全有效(尽管可能不推荐):

<xmltag1>
    <xmltag2 attrib="line 1
line 2
line 3">
    </xmltag2>
</xmltag1>

当我使用LINQ to XML(System.Xml.Linq)解析此类XML时,这些换行符将以静默方式转换为空格' '个字符。

有没有办法告诉XDocument.Load()解析器保留这些换行符?

P.S。:我正在解析的XML是由第三方软件编写的,因此我无法改变换行符的写入方式。

3 个答案:

答案 0 :(得分:8)

如果要保留属性值中的换行符,则需要使用字符引用(例如

)编写它们
<foo bar="Line 1.&#10;Line 2.&#10;Line3."/>

另外,根据XML规范http://www.w3.org/TR/xml/#AVNormalize,XML解析器会将它们规范化为空格。

[edit]如果您想避免属性值规范化,那么使用遗留XmlTextReader加载XML有助于:

            string testXml = @"<foo bar=""Line 1.
Line 2.
Line 3.""/>";

            XDocument test;
            using (XmlTextReader xtr = new XmlTextReader(new StringReader(testXml)))
            {
                xtr.Normalization = false;
                test = XDocument.Load(xtr);
            }
            Console.WriteLine("|{0}|", test.Root.Attribute("bar").Value);

输出

|Line 1.
Line 2.
Line 3.|

答案 1 :(得分:0)

解析后的换行符不是空格(不是ASCII码32)如果单步执行每个字母,您会看到“空格''”是ASCII码10 = LF(LineFeed)(!!) - 所以换行仍然存在 如果您需要尝试在代码中使用ASCII 13替换它们...(文本框(窗体)不显示LF作为换行符)

答案 2 :(得分:0)

根据MSDN

  

尽管XML处理器保留了元素内容中的所有空白,但它们经常在属性值中对其进行规范化。选项卡,回车符和空格报告为单个空格。在某些类型的属性中,它们修剪位于值主体之前或之后的空白区域,并将值中的空白区域减少为单个空格。 (如果DTD可用,则将对所有非CDATA类型的属性执行此修剪。)

     

例如,XML文档可能包含以下内容:

<whiteSpaceLoss note1="this is a note." note2="this
is
a
note.">
     

XML解析器将两个属性值报告为"this is a note.",将换行符转换为单个空格。

我找不到任何关于保留属性空格的内容,但我想根据这个解释可能是不可能的。