1

我有一个稍微糟糕的 XML,我试图在 .NET 中解析它。其他解析器可以使用相同的 XML 文件——也就是说,它们更能容忍用户错误。

XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<kml>
<Document id="12345">
  <name>My name</name>
  <description>My Description</description>
  <myns:author>
    <myns:name>My Name</myns:name>
  </myns:author>
</Document>
</kml>

我像这样加载它:

XmlDocument doc = new XmlDocument();
doc.Load(myFilePath);

第二行正确地抛出了一个异常:

'myns' is an undeclared prefix. Line 6, position 4.

从应用程序的角度来看,我们主要充当另一个应用程序的管道,该应用程序能够处理这个稍微错误的 XML 文件。我们不想拒绝这个第 3 方应用程序能够处理的 XML。

有没有办法禁用或修改 .NET XML 解析器的严格性?

4

3 回答 3

6

有没有办法禁用或修改 .NET XML 解析器的严格性?

模式验证和类似的东西在某种程度上是可选的,但这只是无效的 XML。XML 解析器通常如此严格,而且应该如此。下游应用程序能够处理这一事实本身就是一个令人担忧的迹象,IMO。

选项:

  • (最佳)修复任何产生源“XML”的东西 - 如果您负责代码,那么只需使用 XML API。通常,如果您使用 XML API 编写,它会做正确的事情
  • (还不错)编写一个中间步骤来修复坏的 XML,然后再通过您的主代码。例如,如果只是未声明命名空间前缀的问题myns,您可以通过在根元素中声明它来解决这个问题。您可能希望逐行加载文件,只需更改第二个(根 XML 声明)
  • (可能是最糟糕的)甚至不要尝试将其解析为 XML 文件。只需将其视为原始文本。
于 2013-05-03T19:13:57.223 回答
2

令人惊讶的是,所有先前的答案都是错误的。

您的文档是格式正确的 XML,但不是名称空间格式正确的 XML。这意味着它符合 XML 建议,但不符合 XML 中的命名空间建议。这意味着如果您能找到一个允许关闭命名空间处理的解析器,您将能够解析它。我不知道 Microsoft XML 解析器是否有这样的选项,但我在这里没有看到:

http://msdn.microsoft.com/en-US/library/9khb6435(v=vs.80).aspx

于 2013-05-03T20:40:35.683 回答
2

符合标准的 XML 处理器(包括 .NET API)不区分格式良好的程度,但“轻微”。输入要么是格式良好的,要么不是。

根据您要对文档执行的操作,您有不同的处理选项,但都将涉及某种修改,或者System.Xml公司在这里将毫无用处。

于 2013-05-03T19:13:50.657 回答