1

我有一个 dtd 文件的 char 字符串,我需要一个 xmlDtdPtr 连同我的 xml 文档一起传递给 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 的好的示例或文档。

4

1 回答 1

2

您必须xmlIOParseDTD使用xmlParserInputBuffer

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适当的编码。

于 2013-10-24T17:23:11.137 回答