メモリに保存された 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.c、response.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