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

时间:2013-05-03 19:09:24

标签: c# .net xml

我有一个稍微不好的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文件的应用程序的管道。我们不想拒绝此第三方应用程序能够处理的XML。

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

3 个答案:

答案 0 :(得分:6)

  

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

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

选项:

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

答案 1 :(得分:2)

符合条件的XML处理器(包括.NET API)无法区分良构度,但“轻微”。输入是well-formed,或者不是。

根据您对文档的处理方式,您可以使用不同的选项进行处理,但所有选项都需要进行某种修改,或者System.Xml并且公司在这里没用。

答案 2 :(得分:2)

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

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

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