【问题标题】:How do I load unsanitized XML?如何加载未经处理的 XML?
【发布时间】:2015-08-02 23:29:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# xml sanitization


    【解决方案1】:

    问题

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

    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】:

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

    PS:同时有一个NuGet package,来源在Github

    【讨论】:

    • 谢谢!我忘记了 SGMLReader。
    • 您尝试过任何答案吗?问是因为我以后需要自己阅读蹩脚的第 3 方 XML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多