我需要使用存储在内存中的 DTD 来验证 XML,即类似于以下内容:
static const char *dtd_str = "<!ELEMENT ...>";
xmlDtdPtr dtd;
dtd = xmlParseMemoryDtd(dtd_str);
XML_PARSE_DTDVALID
parser 选项允许验证嵌入到 XML 中的 DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE some_tag[
<!ELEMENT some_tag ...>
...
]>
<some_tag>...</some_tag>
所以一种解决方法是修改内存中的 XML。在“推送模式”中使用解析器会使事情变得更加复杂。在推送模式中,我们必须检测是否是 XML 声明 ( <?xml ...?>
) 或根元素的开始,然后将我们的内联 DTD 放在它们之间。
你能提出更好的解决方案吗?
编辑
一种解决方法是验证解析的 XML 后验,如下面的 Daniel(_DV) 建议。示例:main.c,response.xml。
但我正在寻找“嵌入”DTD 并“即时”验证 XML 的方法,而 libxml2 会逐块解析 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