我有一个相当大的 XML 文档,我想从中提取一些信息。它太大而无法保存在内存中,所以我认为 SAX 解析器是合适的。
不幸的是,生成 XML 文档的人没有仔细阅读规范,因此它包含一些非法的 XML 实体(如
)。不过,除此之外,据我所知,这很好。
对于任何依赖于 libxml 的库,此类错误将禁用未来的 SAX 处理,除非它们在恢复模式下运行
/*
* [ WFC: Legal Character ]
* Characters referred to using character references must match the
* production for Char.
*/
if (IS_CHAR(val)) {
return(val);
} else {
ctxt->errNo = XML_ERR_INVALID_CHAR;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,
"xmlParseCharRef: invalid xmlChar value %d\n",
val);
ctxt->wellFormed = 0;
if (ctxt->recovery == 0) ctxt->disableSAX = 1;
}
return(0);
然而,两者LibXML::XML::SaxParser
似乎都被Nokogiri::XML::SAX
硬编码为不能在恢复模式下运行,所以一旦我遇到一个非法实体,解析就会停止(前者抛出错误,而后者只是停止显示元素开始/结束)。
有没有办法可以在恢复模式下运行其中一个(或另一个 SAX 解析器)?