我有一组使用 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
Run Code Online (Sandbox Code Playgroud)
换句话说,“.toxml()”方法不会创建 Expat(因此开箱即用的 parseString)将解析的内容。
我想要的是将 u'foo' 解析为文本节点的东西。即会逆转 .toxml() 效果的东西
from xml.dom.minidom import parseString
try:
node = parseString('')
except Exception:
node = None
Run Code Online (Sandbox Code Playgroud)
您需要存储什么类型的节点?
显然,如果使用 ; 序列化,Element 节点应该可以正常工作.toxml('utf-8')。结果应该可以按原样解析为 XML 文档,并且可以从 检索元素documentElement,只要其中没有需要在 doctype 中定义的 EntityReference。
另一方面,文本节点需要 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
Run Code Online (Sandbox Code Playgroud)
注释节点可以类似地通过检查 来存储<!--。
其他节点类型(例如 Attr)的工作量会更大,因为它们的 XML 表示形式不容易与文本区分开来。您可能需要存储带外nodeType值才能记住它。OTOH minidom 无论如何都没有toxml()在 Attr 上实现,所以也许这不是问题。
| 归档时间: |
|
| 查看次数: |
14459 次 |
| 最近记录: |