0

メモリに保存された DTD を使用して XML を検証する必要があります。つまり、次のようなものです。

static const char *dtd_str = "<!ELEMENT ...>";
xmlDtdPtr dtd;

dtd = xmlParseMemoryDtd(dtd_str);

XML_PARSE_DTDVALIDパーサー オプションを使用すると、XML に埋め込まれた DTD を検証できます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE some_tag[
<!ELEMENT some_tag ...>
...
]>
<some_tag>...</some_tag>

したがって、回避策はメモリ内 XML を変更することです。「プッシュモード」で使用されるパーサーでは、事態はさらに複雑になります。プッシュ モードでは、XML 宣言 ( <?xml ...?>) またはルート要素の開始を検出し、それらの間にインライン DTD を配置する必要があります。

より良い解決策を提案できますか?

編集

回避策は、Daniel(_DV) が以下に提案するように、解析された XML 事後検証を検証することです。例: main.cresponse.xml

しかし、libxml2 が XML チャンクごとに解析している間に、DTD を「埋め込み」、XML を「オンザフライ」で検証する方法を探していました。次のアプローチは私にとってはうまくいきません:

xmlCtxtUseOptions(ctxt, XML_PARSE_NOENT | XML_PARSE_NOWARNING | XML_PARSE_DTDVALID);

ctxt->sax->internalSubset = ngx_http_file_chunks_sax_internal_subset;
ctxt->sax->externalSubset = NULL;
$ ./parsexml 
validity error : Validation failed: no DTD found !
<response>
         ^
Document is not valid
4

1 に答える 1