0

我目前仅限于使用 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 中做到这一点?

4

1 回答 1

0

Enh,我崩溃了,只是将 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

    ...
于 2018-09-07T18:15:15.377 回答