使用libxml2在C中使用内存中的DTD验证XML

时间:2013-08-15 10:18:34

标签: xml-parsing dtd libxml2

我需要使用存储在内存中的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.cresponse.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

1 个答案:

答案 0 :(得分:0)

xmlValidateDtd允许在已经解析的XML文档的后验中进行DTD验证 确保它对DTD进行验证。这将使用内部子集... http://xmlsoft.org/html/libxml-valid.html#xmlValidateDtd

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

丹尼尔