7

根据这个问题:

XML 属性值中是否允许换行?

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

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

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

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

PS:我解析的XML是第三方软件写的,所以无法改变换行符的写法。

4

3 回答 3

8

如果要保留属性值中的换行符,则需要使用字符引用来编写它们,例如

<foo bar="Line 1.&#10;Line 2.&#10;Line3."/>

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

[编辑]如果你想避免属性值规范化,那么加载带有遗留的 XMLXmlTextReader有助于:

            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.|
于 2012-07-13T08:42:33.467 回答
1

根据MSDN

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

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

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

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

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

于 2012-07-13T09:16:47.543 回答
0

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

于 2012-07-13T08:51:17.897 回答