【发布时间】:2014-11-26 19:41:11
【问题描述】:
我使用 XmlDocument.Load() 解析从嵌入式资源读取的 XML 文本。有包含多行的文本元素。我读过 XML 解析器应该规范化换行符,将 CR-LF 对转换为单个 LF 字符。但我发现在某些情况下它不会。更奇怪的是,有时它会进行标准化,我无法弄清楚这种行为取决于什么。我们根据这种行为进行了一些单元测试,它们在某些机器上通过而在其他机器上失败,并且同一台机器上的不同程序表现不同。我错过了什么?
这是一个简单的测试程序,在我的例子中,它总是显示 CR 和 LF 都按字面意思保留。 (但我提到的单元测试在同一台机器上通过,表明换行已标准化)。设置 PreserveWhitespace 并没有什么不同。
asm = Assembly.GetExecutingAssembly();
res = asm.GetManifestResourceStream("test.xml");
var doc = new XmlDocument();
var reader = new StreamReader(res);
doc.Load(reader);
var root = doc.DocumentElement;
var text = root.InnerText;
var cr = text.IndexOf('\r');
var lf = text.IndexOf('\n');
Console.WriteLine("CR:{0} LF:{1}", cr, lf);
【问题讨论】:
-
机器上安装的底层MSXML.dll是否有区别,实际上现在我提到它我不确定运行时是否使用MSXML*dlls?
-
作为健全性检查,您应该将 SteamReader 的输出保存为文本,并在工作机器和非工作机器上进行比较。这样,您就会知道问题出在 XmlDocument 中,而不是进一步的“上游”。
-
正如我所提到的,有时工作机器和非工作机器是同一台机器,所以还有其他一些东西会有所不同。我尝试了 StreamReader 的输出(使用 ReadToEnd),它包含所有控制字符。我不确定这是否应该被认为是错误的(微软文档对此只字未提)。
标签: c# .net xml-parsing