使用 LINQ To XML (System.Xml.Linq) 读取 XML 文件时,我需要能够保留多行文本属性中的换行符。这是一个 XML 文件示例。
<?xml version="1.0" encoding="utf-8"?>
<TestRoot>
<Properties Description="Line 1
Line 2" />
</TestRoot>
这是我尝试过的代码:
const string xmlPath = @"C:\Blah\Test.xml";
var rootElement = XElement.Load(xmlPath);
var propertiesElement = rootElement.Element("Properties")!;
var descriptionAttribute =
propertiesElement.Attribute("Description")!;
string description = descriptionAttribute.Value;
Console.WriteLine(description);
预期输出:
Line 1
Line 2
实际产量:
Line 1 Line 2
LINQ to XML(以及内部的
XmlReader
)正在用空格替换属性内的换行符,因为 XML 标准要求它们这样做。来自 3.3.3 属性值标准化:
3.3.3 属性值标准化
在将属性值传递给应用程序或检查有效性之前,XML 处理器必须通过应用下面的算法或使用某种其他方法来标准化属性值,以便传递给应用程序的值与传递给应用程序的值相同由算法产生。
所有换行符必须在 #xA 的输入上进行标准化,如 2.11 行尾处理中所述,因此该算法的其余部分对以这种方式标准化的文本进行操作。
以由空字符串组成的标准化值开始。
对于非标准化属性值中的每个字符、实体引用或字符引用,从第一个开始一直到最后一个,执行以下操作:
对于字符引用,将引用的字符附加到标准化值。
对于实体引用,递归地将此算法的步骤 3 应用于实体的替换文本。
对于空白字符(#x20、#xD、#xA、#x9),将空格字符 (#x20) 附加到标准化值。
对于另一个字符,将该字符附加到标准化值。
因此,如果您希望 XML 属性值中包含换行符,则必须将其转义为


。事实上,它没有如此转义将是发送系统中的一个错误,应该修复。
XmlTextReader
类有一个可以禁用的 Normalization
属性:
获取或设置一个值,指示是否规范化空白和属性值。
因此可以使用以下代码读取您的属性值:
using var xmlReader = new XmlTextReader(xmlPath)
{
Normalization = false,
};
var rootElement = XElement.Load(xmlReader);
var propertiesElement = rootElement.Element("Properties")!;
var descriptionAttribute =
propertiesElement.Attribute("Description")!;
string description = descriptionAttribute.Value;
Console.WriteLine(description);
XmlTextReader
文档备注:
从 .NET Framework 2.0 开始,我们建议您使用 XmlReader.Create 方法创建 XmlReader 实例以利用新功能。
因此使用需要您自担风险。
演示小提琴在这里。