如何加载未经过简化的XML?

时间:2009-07-30 14:26:51

标签: c# xml sanitization

我们有当前发行版中的应用程序生成的各种XML文件。其中一些文件已经证明包含无效字符,导致它们无法在大多数情况下加载无效的XML,除非关闭所有验证,然后仅在XmlDocument个实例中,而不是XDocument

由于此应用已经在那里,我们必须处理它产生的文件。现在,我可以继续添加Sanitizer类型,它知道在尝试加载文档之前要查找什么以及如何修复它,但是我希望有人可能已经投入了很多努力这已经以有效的方式完成了(例如SanitizedXmlReader类)。

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

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

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

<强>问题

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

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

XML 1.0 revision 5也改变了earlier versions的规则,但不能以任何方式从文档中分辨出来。它简化了有关Unicode的一些事情,但是反对一些原始规范作者的建议。我们也假装这个问题不存在。

<强>答案

Java有一个很好的小类XmlChar,它有一些方法可以用来确定哪些字符对哪些结构有效。 .Net没有,但是Mono项目包含System.Xml.XmlChar的来源,这可能会帮助你。

您可以首先过滤掉绝对不允许在任何地方使用的所有字符。上面的Mono类中的XmlChar.IsValid(char c)方法应该会有所帮助。

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

答案 2 :(得分:2)

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

PS:同时有一个NuGet package,来源可以在Github找到。