在之前所写的解析XML:ElementTree一文中,我是用Python标准库里的xml.etree.ElementTree来实现的。不过这种对于含有命名空间的XML则显得不大方便和直观。其实Python标准库里还提供了更简单的方法,那就是利用The Document Object Model API,即xml.dom。这种方法通过检索DOM树实现。还是以之前的XML文档为例:
<?xml version="1.0" encoding="utf-8"?> <CSubmitState xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/"> <State>0</State> <MsgID>1311211532361125903</MsgID> <MsgState>提交成功</MsgState> <Reserve>0</Reserve> </CSubmitState>
首先将其解析到内存中:
>>> import xml.dom.minidom >>> dom = xml.dom.minidom.parseString(xml) >>> dom <xml.dom.minidom.Document instance at 0x02942A30>
接下来就可以采用类似JavaScript里DOM树的操作方法来找到我们想要的节点,例如获取“<State>0</State>”:
>>> nodes = dom.getElementsByTagName('State') >>> nodes [<DOM Element: State at 0x286e5f8>]
然后遍历该节点内的节点找到所需的文本内容(这里节点内仅包含一个文本子节点):
>>> text = '' >>> for node in nodes[0].childNodes: if node.nodeType == xml.dom.minidom.Node.TEXT_NODE: text += node.data >>> text u'0'
这种方法方便而易于理解,不过如果DOM树很大,那性能可能相对较低。