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