XML 文件中的不可见差异 - 破坏自制的 XML 解析器

Invisible differences in XML files - breaking self-made XML parser

我有两个程序与定义明确的 XML 文件进行交互。第一个程序(模型)读取它,解析它,并使用文件中的内容来指导模型的 运行ning。第二个程序(Controller)打开并重写 XML 文件,允许模型中的不同设置 运行。

模型是用 C++ 编写的,可在 VS2010 和 VS2012 中使用,没有 GUI,并使用自制的(这是正确的术语吗?)XML 已经工作多年而没有失败的解析器- 我刚刚检查了 SVN 是否对构成它的文件进行了修订 - 自 2013 年以来没有任何内容。控制器是用 C# 编写的,在 VS2012 中,带有一个 GUI,该 GUI 具有用于设置 XML 文件内容的下拉菜单,并且使用 XmlDocument class 读入、编辑和打印 XML 文件。

突然之间,Controller 不再吐出 XML Model 可以读取的文件。当 Model 尝试读取 XML 文件时,它遇到的第一个字符读作“-17”。据我所知,这意味着它无法将其识别为 UTF-8 字符。这导致模型计算出错误然后崩溃。较旧的 XML 文件(看起来与 Controller 编写的文件相同)可以正常读取。

以下是文件示例 - 请忽略元素中的内容。可能有人会说可能是内容问题,但我反复核对过,是对的。如果内容很重要,为什么在读取 XmlDocument 创建的文件时模型中的解析器会在第一个字符 ('<' = '-17') 处失败?

旧文件:

<?xml version="1.0" encoding="UTF-8" ?> 
<Config>
<Mode value="false" Id="Modeflag" />
<Timestep OutputTimestep="Hourly"  CalibrationTimestep="Houry" />
<InitialInput SubCatchmentNumber="1" ModelCalibration="true" SnowSimulation="false" VegSimulation="Method 1" CatchmentNumber="1" FractionalCatchmentArea="1" />
<InputResource Name="All" Location="C:\AutoRun_Newest\AutoRun" Id="Directory" />
<SimulationScheme SchemeForCatchmentNo="8" Infiltration="true" ChannelRouting="false" Saturation="true" TopographicIndex="true" KDecayWithSoilDepthExp="false" SoilTopoIndex="false" KDecayInPower="true" />
<SnowInput InputCatchmentNumber="1" TempIndexMethod_Hourly="false" RadiationTempIndex_With_SnowInterception="true" EnergyBudgetMethod_With_SnowInterception="false" />
<SnowInputResource Name="All" Location="C:\AutoRun_Newest\AutoRun" Id="SnowDirectory" />
<OutputDirectory Location="C:\AutoRun_Newest\Inputs\Output_Timestamp_07012015215112" Name="Toronto_Output" />
</Config>

较新的文件:

<?xml version="1.0" encoding="UTF-8" ?>
<Config>
  <Mode value="false" Id="Modeflag" />
  <Timestep OutputTimestep="Hourly" CalibrationTimestep="Hourly" />
  <InitialInput SubCatchmentNumber="1" ModelCalibration="true" SnowSimulation="false" VegSimulation="Method 1" CatchmentNumber="1" FractionalCatchmentArea="1" />
  <InputResource Name="All" Location="C:\AutoRun_Newest\AutoRun" Id="Directory" />
  <SimulationScheme SchemeForCatchmentNo="8" Infiltration="true" ChannelRouting="false" Saturation="true" TopographicIndex="true" KDecayWithSoilDepthExp="false" SoilTopoIndex="false" KDecayInPower="true" />
  <SnowInput InputCatchmentNumber="1" TempIndexMethod_Hourly="false" RadiationTempIndex_With_SnowInterception="true" EnergyBudgetMethod_With_SnowInterception="false" />
  <SnowInputResource Name="All" Location="C:\AutoRun_Newest\AutoRun" Id="SnowDirectory" />
  <OutputDirectory Location="C:\AutoRun_Newest\Inputs\Output_Timestamp_07012015215112" Name="Toronto_Output" />
</Config>

添加或取消缩进(通过 C# 中的 XmlDocument class 进行正确格式化)不会改变模型的行为。

这些文件在外观上完全相同,我看不到任何奇怪的字符或空格。什么不可见的 objects/forces/characters 或其他设置可能导致这个新错误?

XML 文档 class 强制执行的某些背景编码对我自制的解析器来说是新的吗?

文件开头有一个字节顺序标记 (BOM)。 https://en.wikipedia.org/wiki/Byte_order_mark

BOM为Unicode字符U+FEFF,或UTF-8字节0xEF,0xBB,0xBF。如果将 0xEF 重新解释为有符号字节,则它是 -17。如果您保存文件,许多 Windows 工具会将 BOM 放在文件的开头。