如何在python中解析表示xml.dom.minidom节点的字符串?

Fra*_*vey 4 python xml

我有一组使用 xml.dom.minidom 创建的节点 xml.dom.Node 对象。我通过使用 Node 对象的 toxml() 方法将它们转换为字符串,将它们(单独)存储在数据库中。

问题是我有时希望能够使用某种解析器将它们转换回适当的 Node 对象。据我所知,python 附带的各种库使用 Expat,它不会解析像 '' 这样的字符串,或者任何不是正确的 xml 字符串的字符串。

那么,有人有任何想法吗?我意识到我可以以某种方式腌制节点,然后取消它们,但这感觉不愉快,我更愿意以我可以阅读的形式存储以进行维护。肯定有什么可以做到这一点?

为了回应表示这是可能的怀疑,我的意思的一个例子:

>>> import xml.dom.minidom
>>> x=xml.dom.minidom.parseString('<a>foo<b>thing</b></a>')
>>> x.documentElement.childNodes[0]
<DOM Text node "u'foo'">
>>> x.documentElement.childNodes[0].toxml()
u'foo'
>>> xml.dom.minidom.parseString(x.documentElement.childNodes[0].toxml())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py", line 1928, in parseString
    return expatbuilder.parseString(string)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 940, in parseString
return builder.parseString(string)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 223, in parseString
parser.Parse(string, True)
xml.parsers.expat.ExpatError: syntax error: line 1, column 0
Run Code Online (Sandbox Code Playgroud)

换句话说,“.toxml()”方法不会创建 Expat(因此开箱即用的 parseString)将解析的内容。

我想要的是将 u'foo' 解析为文本节点的东西。即会逆转 .toxml() 效果的东西

Tom*_*lak 5

from xml.dom.minidom import parseString

try:
  node = parseString('') 
except Exception:
  node = None
Run Code Online (Sandbox Code Playgroud)


bob*_*nce 5

您需要存储什么类型的节点?

显然,如果使用 ; 序列化,Element 节点应该可以正常工作.toxml('utf-8')。结果应该可以按原样解析为 XML 文档,并且可以从 检索元素documentElement,只要其中没有需要在 doctype 中定义的 EntityReference。

另一方面,文本节点需要 HTML 解码或一些包装来解析。如果您只需要元素和文本节点,您可以从第一个字符猜测它是否是一个元素,因为它必须始终是<一个元素:

var xml= node.toxml('utf-8')

...

if (xml.startswith('<')):
    node= minidom.parseString(xml).documentElement
else:
    node= minidom.parseString('<x>%s</x>'%xml).documentElement.firstChild
Run Code Online (Sandbox Code Playgroud)

注释节点可以类似地通过检查 来存储<!--

其他节点类型(例如 Attr)的工作量会更大,因为它们的 XML 表示形式不容易与文本区分开来。您可能需要存储带外nodeType值才能记住它。OTOH minidom 无论如何都没有toxml()在 Attr 上实现,所以也许这不是问题。