Python解析XML

一个小例子(python遵循标准的dom的API):

API请参考

http://docs.python.org/library/xml.dom.html

http://docs.python.org/library/xml.dom.minidom.html

 

entity.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<db>
	<table name="User">
		<column name="id" />
		<column name="name" />
		<column name="password" />
	</table>
	<table name="Department">
		<column name="id" />
		<column name="name" />
	</table>
</db>

 

entity.py

 

from xml.dom.minidom import parse

if __name__ == '__main__':
    db = {}
    dom = parse("entity.xml")
    root = dom.documentElement
    tableNodes = root.getElementsByTagName('table')
    for tableNode in tableNodes:
        tableName = tableNode.attributes['name'].value
        columnNodes = tableNode.getElementsByTagName('column')
        db[tableName] = [columnNode.attributes['name'].value 
                         for columnNode in columnNodes]
    print db
 

 

动态语言啊,没IDE的提示,查API查的吐血,语法倒是写的爽了,那个简练啊,可是。。。

 

 

### 使用 Python 解析 XML 的方法 Python 提供了多种方式来解析 XML 数据,无论是文件还是字符串形式。以下是常见的几种方法及其特点: #### 方法一:`xml.etree.ElementTree` 这是 Python 标准库中的一个模块,用于解析和创建 XML 数据结构。它的设计目标是轻量化和易用性。 ```python import xml.etree.ElementTree as ET # 从文件中读取XML tree = ET.parse('example.xml') root = tree.getroot() # 遍历子节点 for child in root: print(child.tag, child.attrib) # 查找特定元素 element = root.find('.//book/title') # 使用XPath表达式 print(element.text) ``` 该模块支持基本的 XML 操作以及 XPath 查询功能[^1]。 --- #### 方法二:`minidom` (DOM 方式) `minidom` 是 DOM(文档对象模型)的一种实现,允许将整个 XML 文档加载到内存中作为树形结构操作。 ```python from xml.dom import minidom xmldoc = minidom.parse('example.xml') items = xmldoc.getElementsByTagName('item') for item in items: name = item.attributes['name'].value print(name) ``` 尽管 `minidom` 功能强大,但由于其性能较差且 API 较复杂,通常不推荐使用它处理大规模数据[^4]。 --- #### 方法三:`lxml` 库 `lxml` 是第三方库,提供了更快的速度和更丰富的特性,兼容 `ElementTree` 接口的同时还增加了额外的功能。 安装命令: ```bash pip install lxml ``` 代码示例: ```python from lxml import etree # 解析XML字符串 xml_string = '<root><child>Text</child></root>' root = etree.fromstring(xml_string) # 输出子节点文本 print(root.find('child').text) # 支持XPath查询 result = root.xpath('//child/text()') print(result) ``` 相比标准库,`lxml` 更适合需要高性能或高级特性的场景[^3]。 --- #### 方法四:`SAX` 解析器 如果 XML 文件非常大以至于无法一次性载入内存,则可以考虑使用 SAX(Simple API for XML)。这是一种基于事件驱动的方式,逐步遍历 XML 节点而不构建完整的树状结构。 ```python import xml.sax class MyHandler(xml.sax.ContentHandler): def startElement(self, name, attrs): print(f'Start element: {name}') def endElement(self, name): print(f'End element: {name}') handler = MyHandler() xml.sax.parse('large_file.xml', handler) ``` 此方法适用于流式处理超大数据集的情况。 --- #### 将 XML 字符串转为字典 对于希望简化 XML 结构的操作者来说,有时会倾向于将其转化为 Python 原生的数据类型——字典。可以通过自定义脚本或者借助社区贡献完成这一过程。 ```python def parse_xml_to_dict(node): result = {} if node.text.strip(): result[node.tag] = node.text else: result[node.tag] = {k: v for k, v in node.attrib.items()} children = list(node) if children: result[node.tag]['children'] = [parse_xml_to_dict(c) for c in children] return result # 示例调用 data = '''<a attr="value"><b>hello</b><c>world</c></a>''' node = ET.fromstring(data) dictionary = parse_xml_to_dict(node) print(dictionary) ``` 这种方法能够满足大部分简单需求,但对于嵌套层次较深或存在重复标签名的情形可能不够健壮[^3]。 --- ### 总结 每种技术都有自己的适用范围,请根据具体项目需求选择合适的方案。如果是小型应用开发,建议优先尝试内置的 `xml.etree.ElementTree`;而对于追求效率和服务端部署的应用程序而言,引入外部依赖如 `lxml` 则更为理想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值