使用libxml2 for python从文本加载DTD

时间:2018-07-07 22:14:32

标签: python libxml2 dtd-parsing

我目前仅限使用libxml2(而不是lxml)在QNX 6.5上进行解析。我想使用从字符串而不是从文件加载的DTD来验证我的xml。

lxml可让您执行以下操作:

import lxml
from lxml import etree
from StringIO import StringIO

dtd_string = """
<!ELEMENT page (title)>
<!ELEMENT title (#PCDATA)>
"""

xml = """
<page>
  <title>Hello</title>
 </page>
 """

dtd = etree.DTD(StringIO(dtd_string))
root = etree.fromstring(xml)
is_valid = dtd.validate(root)

我想使用libxml2做同样的事情。我可以从文件中加载DTD,但不知道也找不到从字符串中加载DTD的语法:

import libxml2
dtd = libxml2.parseDTD(None, dtd_file)  #How to parse DTD from a string??
ctxt = libxml2.newValidCtxt()
doc = libxml2.parseDoc(xml)
is_valid = doc.validateDtd(ctxt, dtd)
#cleanup omitted 

有人碰巧知道如何在libxml2中做到这一点吗?

1 个答案:

答案 0 :(得分:0)

恩,我崩溃了,只是将xml读取到一个字符串中,并将dtd附加到了它。

我仍然欢迎任何更好的解决方案。

import libxml2

doc = None
dtd = None
ctxt = None

try:

    xml = MY_DTD + filehandle.read().replace('\n', '') 

    ctxt = libxml2.newValidCtxt()

    doc = libxml2.parseDoc(xml)

    if not doc.validateDocument(ctxt):
        return 

    root = doc.children

    ...