0

我需要使用存储在内存中的 DTD 来验证 XML,即类似于以下内容:

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

dtd = xmlParseMemoryDtd(dtd_str);

XML_PARSE_DTDVALIDparser 选项允许验证嵌入到 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.cresponse.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
4

1 回答 1

0

xmlValidateDtd 允许对已解析的 XML 文档进行 DTD 验证,以确保它针对 DTD 进行验证。这不会使用内部子集... http://xmlsoft.org/html/libxml-valid.html#xmlValidateDtd

有关如何使用它的完整示例,请参见 libxml2 中的 xmllint.c 代码,

丹尼尔

于 2013-08-19T12:25:00.270 回答