Monday, February 23, 2009

如何用minidom解析xml

在实际的项目中我们可能要解析xml配置文件来设置系统的属性,Python中的xml处理功能非常强大而且简单,使用Python来处理xml非常简单,举个例子,假设我们有一个xml文件如下:
<database>
<table name='product'>
<field name='P_name' type='string'/>
<field name='P_brand' type='string'/>
<field name='P_price' type='number'/>
<field name='P_unit' type='string'/>
</table>
<table name='part'>
<field name='P_name' type='string'/>
<field name='P_platform' type='string'/>
<field name='P_weight' type='number'/>
<field name='P_volume' type='number'/>
</table>
</database>

现在我们想把这个database中所有的table的内容都打印出来,或者我们想找出所有字段名为p_name的字段,使用python的minidom包可以非常简单的完成:
from xml.dom.minidom import parse
import re
dom=parse("config.xml")
for table in dom.getElementsByTagName('table'):
tableName=field.getAttributeNode('name').nodeValue
for field in field.getElementsByTagName('field'):
name=style.getAttributeNode('name').nodeValue
type=style.getAttributeNode('type').nodeValue
if re.search('p_name',name):
print tableName,',',name,',',type


我们来一行行的解释一下上面的代码:
首先我们需要导入parse解析器,这是用来解析xml文档的模块,它位于xml.dom.minidom下。为了查找字段名为p_name的表我们需要使用正则表达式,通过import re来导入Python中的正则表达式。
接着dom=parse("config.xml")
用来将我们要解析的xml文件加载进来。getElementsByTagName方法用来查找这个xml中元素节点名为table的节点,getAttributeNode方法是查找这个元素的一个属性,其中后面的nodeValue是一个节点的通用属性,你可以在元素或者属性对象上调用这个方法来获得这个节点的文本值。
之后就是在查找到的元素或者属性集合中循环,然后通过re.search()方法查找匹配条件的节点并打印他们的内容。
怎么样是不是很简单,整个代码只有11行却完成了我们想要的功能。

No comments:

Post a Comment