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

时间:2010-05-23 11:54:06

标签: 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

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

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

效果的东西

2 个答案:

答案 0 :(得分:3)

from xml.dom.minidom import parseString

try:
  node = parseString('') 
except Exception:
  node = None

答案 1 :(得分:2)

您需要存储哪些类型的节点?

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

另一方面,

文本节点需要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

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

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