我需要使用存储在内存中的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。
你能建议更好的解决方案吗?
修改
解决方法是验证已解析的XML后验,如Daniel(_DV)所述。 示例:main.c,response.xml。
但我正在寻找“嵌入”DTD的方法,并“在运行中”验证XML,而libxml2解析XML chunk-by-chunk。 以下方法对我不起作用:
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
答案 0 :(得分:0)
xmlValidateDtd允许在已经解析的XML文档的后验中进行DTD验证 确保它对DTD进行验证。这将不使用内部子集... http://xmlsoft.org/html/libxml-valid.html#xmlValidateDtd
有关如何使用它的完整示例,请参阅libxml2中的xmllint.c代码,
丹尼尔