我目前仅限于使用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,但不知道,也无法找到从字符串加载它的语法:
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中这样做?
恩,我崩溃了,只是把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
...