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

如何在python中解析表示xml.dom.minidom节点的字符串?,python,xml,Python,Xml,我有一组使用xml.dom.minidom创建的节点xml.dom.Node对象。通过使用Node对象的toxml()方法将它们转换为字符串,我将它们(单独)存储在数据库中 问题是,我有时希望能够使用某种解析器将它们转换回适当的节点对象。据我所知,python附带的各种库都使用Expat,它不会解析像“”这样的字符串,或者任何不正确的xml字符串 那么,有人有什么想法吗?我意识到我可以以某种方式对节点进行pickle,然后将其解除pickle,但这让我感觉不舒服,我更愿意将其存储在一个可以读取的

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

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

那么,有人有什么想法吗?我意识到我可以以某种方式对节点进行pickle,然后将其解除pickle,但这让我感觉不舒服,我更愿意将其存储在一个可以读取的表单中,以便进行维护。肯定有什么东西可以做到这一点

针对表示这是可能的疑问,我举了一个例子来说明我的意思:

>>> 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
导入xml.dom.minidom >>>x=xml.dom.minidom.parseString('foothing') >>>x.documentElement.childNodes[0] >>>x.documentElement.childNodes[0].toxml() 乌福 >>>xml.dom.minidom.parseString(x.documentElement.childNodes[0].toxml()) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py”,第1928行,格式为parseString 返回expatbuilder.parseString(字符串) 文件“/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py”,第940行,格式为parseString return builder.parseString(字符串) 文件“/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py”,第223行,格式为parseString parser.Parse(字符串,True) xml.parsers.expat.expat错误:语法错误:第1行第0列 换句话说,“.toxml()”方法不会创建Expat(以及现成的parseString)将要解析的内容


我想要的是将u'foo'解析为文本节点的东西。也就是说,一些可以逆转.toxml()效果的东西。

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

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


另一方面,文本节点需要HTML解码或一些包装来解析。如果您只需要元素和文本节点,您可以从第一个字符猜出它是否是元素,因为它必须始终是
我不知道调用
toxml()
如何生成不正确的XML片段。。。因此,
toxml()
生成的所有字符串都应该可以通过
xml.dom.minidom
parse()
parseString()
函数进行解析……谢谢您的示例。事实上,文本节点是以纯文本形式呈现的,这不是有效的xml。我正在存储它的数据,所以我试图保守我所做的任何假设,但你可能是对的,我只需要担心元素和文本节点。Attr不会成为问题,但可能会有一些评论。如果有一个简单的解析器可以接受字符串,那就太好了,但是存储这种类型的带外注释可能就足够了。只是数据库中的另一列。谢谢
from xml.dom.minidom import parseString

try:
  node = parseString('') 
except Exception:
  node = None
var xml= node.toxml('utf-8')

...

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