【问题标题】:XmlDocument and line breaksXmlDocument 和换行符
【发布时间】: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


【解决方案1】:

如果你想要规范化,你必须将XmlReader 实例传递给XmlDocument.Load 函数确保:

asm = Assembly.GetExecutingAssembly();
res = asm.GetManifestResourceStream("test.xml");
var doc = new XmlDocument();
var reader = new StreamReader(res);
var xmlreader = XmlReader.Create(reader)
doc.Load(xmlreader);

XmlReaderData conformance section on MSDN 中列出了它确实进行了规范化。

当我查找 Load methods in the reference source 时,似乎 XmlDocument 的重载便利 Load 方法使用了 XmlTextReader,其 Normalization property defaults to false

当我查看 .NET Core's version of XmlDocument 时,Load 函数使用普通的 XmlReader 代替。这可能表明内部代码在某些时候发生了更改,并且它可能解释了您在明显相似的代码中看到的一些奇怪行为。

XmlDocument 的这种行为在 MSDN 上没有记录,这就是我在计算摘要时碰到它的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2015-03-19
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多