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

2024-05-19 15:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用xml.dom.minidom创建的nodes 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

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

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


Tags: 对象字符串in节点foolinelibraryxml
1条回答
网友
1楼 · 发布于 2024-05-19 15:21:30
from xml.dom.minidom import parseString

try:
  node = parseString('') 
except Exception:
  node = None
网友
2楼 · 发布于 2024-05-19 15:21:30

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

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

另一方面,文本节点需要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表示不易与文本区分。您可能需要存储带外nodeType值才能记住它。OTOH minidom无论如何都不会在Attr上实现toxml(),所以这可能不是问题。

相关问题 更多 >