使用libxml2从内存中读取DTD

时间:2013-10-24 14:52:37

标签: c xml-parsing dtd libxml2

我有一个dtd文件的char字符串,我需要一个xmlDtdPtr与xml doc一起传递给xmlValidateDtd。

将dtd作为当前目录中的文件,我这样做:

xmlParserCtxtPtr ctxt = xmlNewParserCtxt();
xmlDocPtr doc = xmlCtxtReadFile(ctxt, filename, NULL,0);
xmlDtdPtr dtd = xmlParseDTD(NULL,(const xmlChar*)dtd_filename);
xmlValidateDtd(&(ctxt->vctxt),doc,dtd);

我试过了:

XmlDocPtr dtd_doc = xmlReadMemory(dtd_string,sizeof(dtd_string),"blah.dtd",NULL,XML_PARSE_DTDLOAD);
xmlDtdPtr dtd = xmlNewDtd(dtd_doc,NULL,NULL,NULL);

但是我得到解析器错误抱怨<!ELEMENT是一个无效的元素名称。 我找不到任何关于如何从内存中正确解析DTD的好例子或文档。

1 个答案:

答案 0 :(得分:2)

您必须将xmlIOParseDTDxmlParserInputBuffer

一起使用
xmlParserInputBufferPtr buf = xmlParserInputBufferCreateMem(string, size, XML_CHAR_ENCODING_NONE);
xmlDtdPtr dtd = xmlIOParseDTD(NULL, buf, XML_CHAR_ENCODING_NONE);
xmlFreeParserInputBuffer(buf);

如果您的DTD不包含文字声明,请将XML_CHAR_ENCODING_NONE替换为appropriate encoding