3

我们有各种由当前发行版中的应用程序生成的 XML 文件。其中一些文件已被证明包含无效字符,从而使它们成为无效的 XML,除非所有验证都关闭,否则在大多数情况下都不会加载,然后,仅在XmlDocument某些情况下,不会加载XDocument.

由于这个应用程序已经存在,我们必须处理它产生的文件。现在,在尝试加载文档之前,我可以继续添加一个Sanitizer知道要查找什么以及如何修复它的类型,但我希望有人可能已经付出了努力来产生一些可能已经在高效的方式(如SanitizedXmlReader上课)。

这个问题涉及相同的主题,但我没有在那里找到令人满意的答案。我们想要的只是删除 XML 文件中任何位置的无效内容(而不是仅在 CDATA 中有效或在 QName 中未使用时有效的数据)。

那么,是否存在这样一种东西,可以将“几乎”的 XML 文件变成“至少没有无效字符”的 XML 文件?如果没有,我们自己的滚动是下一个选择。在这种情况下,与其花时间解释 XML 规范以确定哪些字符在所有情况下都是非法的,不如在某个地方有一个明确的列表?

4

2 回答 2

3

问题

如果你最终写了自己的,知道哪些字符是有效的肯定有点棘手。

XML 1.1改变了规则,但让我们假设没有人使用它(因为几乎没有人使用它),并坚持使用 1.0。

XML 1.0 修订版 5也从早期版本更改了规则,但您无法从文档本身看出任何方式。它简化了关于 Unicode 的一些事情,但违背了一些原始规范作者的建议。我们也假设这个问题不存在。

回答

Java 有一个不错的小类 ,XmlChar它有一些方法可以用来确定哪些字符对哪些结构有效。.Net 没有,但 Mono 项目包含System.Xml.XmlChar可能对您有所帮助的源代码。

您可以先过滤掉所有绝对不允许出现的字符。XmlChar.IsValid(char c)上述 Mono 类中的方法应该会有所帮助。

了解该应用程序产生了哪些其他类型的错误 XML 会很有趣。

于 2009-07-30T16:50:14.260 回答
2

几年前我使用SGMLReader加载糟糕的 HTML 代码。这也可以帮助您解析无效的 XML。

PS:同时还有一个NuGet 包,源代码在Github上可用。

于 2009-07-30T15:20:45.090 回答