かなり大きな 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 パーサー) を回復モードで実行する方法はありますか?