1

大多数 XML 解析器会在文档中出现第一个错误后放弃。事实上,IIRC,这实际上是解析器“官方”规范的一部分。

我正在寻找可以打破该规则的东西。它应该接受一个给定的模式(假设一个有效的模式)和一个 xml 输入,并尝试在第一个错误之后继续进行,并为每个错误引发一个事件或在完成时返回一个列表,所以我可以使用它来生成某种报告文件中的错误。这个要求来自上面,所以让我们尽量将纯粹主义者的“但继续下去没有意义”的评论保持在最低限度。

我正在寻找可以评估文档是否格式正确以及是否符合架构的东西。理想情况下,它会将这些评估为不同类别的错误。我更喜欢 .Net 解决方案,但我也可以使用独立的 .exe。如果您知道使用不同平台的人,请继续发布它,因为其他人可能会发现它有用。

更新:

我希望我使用它的大多数文档大部分都是格式良好的。可能是一个 & 包含在数据中,而不是在这里和那里的 &,或者偶尔放错标签。我不指望解析器能够从任何事情中恢复,只是为了尽最大努力继续前进。如果一个文档太乱了,它应该尽可能多地吐出,然后是某种“致命的,无法继续”的错误。否则,模式验证部分非常简单。

4

3 回答 3

1

事实上,IIRC,这实际上是解析器“官方”规范的一部分。

官方不需要引用:)

致命错误

[定义:] 符合标准的 XML 处理器必须检测并报告给应用程序的错误。在遇到致命错误后,处理器可能会继续处理数据以搜索更多错误,并且可能会将此类错误报告给应用程序。为了支持对错误的纠正,处理器可以使来自文档的未处理数据(具有混合的字符数据和标记)对应用程序可用。然而,一旦检测到致命错误,处理器就不能继续正常处理(即,它不能继续以正常方式将字符数据和有关文档逻辑结构的信息传递给应用程序)。

您可以将xmllint与恢复选项一起使用。

于 2008-08-28T17:51:49.260 回答
1

听起来您可能想要TagSoup。它可能不是您想要的,但就不良文档处理解析器而言,它是黄金标准。

于 2008-08-28T18:41:48.983 回答
1

Xerces有一个功能,您可以设置在发生致命错误后尝试并继续:

http://apache.org/xml/features/continue-after-fatal-error
True:尝试在发生致命错误后继续解析。
False:在第一个致命错误时停止解析。
默认值:false
注意:当这个特性设置为 true 时解析器的行为是不确定的!因此,请谨慎使用此功能,因为解析器可能会陷入无限循环或更糟的情况。

于 2008-08-29T06:13:51.740 回答