我有一个使用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()
效果的东西答案 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()
所以也许这不是问题。