Python之xml解析

python有三种方法解析XML,SAX,DOM,以及ElementTree:

1.SAX (simple API for XML )

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

2.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

xml.dom.minidom 模块被用来处理xml文件

parse():用于打开一个xml文件

documentElement:用于得到dom对象的文档元素,并将获得的对象给root,每一个结点都有它的nodeName,nodeValue,nodeType属性

*使用parse()或createDocument()返回的为DOM对象;
*使用DOM的documentElement属性可以获得Root Element;
*DOM为树形结构,包含许多的nodes,其中element是node的一种,可以包含子elements,textNode也是node的一种,是最终的子节点;
*每个node都有nodeName,nodeValue,nodeType属性,nodeValue是结点的值,只对textNode有效。对于textNode,想得到它的文本内容可以使用: .data属性。

*getElementsByTagName()可以根据名字来查找子elements;
*childNodes返回所有的子Nodes,其中所有的文本均为textNode,包含元素间的‘\n\r’和空格均为textNode;

*writexml()时addindent='  '表示子元素的缩进,newl='\n'表示元素间的换行,encoding='utf-8'表示生成的xml的编码格式(<?xml version="1.0" encoding="utf-8"?>)。

  from xml.dom import minidom
  doc = minidom.parse("employees.xml")
  
  # get root element: <employees/>
  root = doc.documentElement
  
  # get all children elements: <employee/> <employee/>
  employees = root.getElementsByTagName("employee")

3.ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

ElementTree生来就是为了处理XML,它在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。

ElementTree解析XML文件的过程:

导入ElementTree,import xml.etree.ElementTree as ET

解析Xml文件找到根节点:直接解析XML文件并获得根节点,tree = ET.parse('country_data.xml') root = tree.getroot()

或者解析字符串,root = ET.fromstring(country_data_as_string)

遍历根节点可以获得子节点,然后就可以根据需求拿到需要的字段了

import xml.etree.ElementTree as ET 
tree = ET.parse('country_data.xml') 
root = tree.getroot() 
print('root-tag:',root.tag,',root-attrib:',root.attrib,',root-text:',root.text) 
for child in root: 
    print('child-tag是:',child.tag,',child.attrib:',child.attrib,',child.text:',child.text) 
    for sub in child: 
        print('sub-tag是:',sub.tag,',sub.attrib:',sub.attrib,',sub.text:',sub.text)

查找指定的子节点:

当XML文件较大或者其中的子节点tag非常多的时候,一个一个获取是比较麻烦的而且有很多不是我们需要的,这样我们可以通过find('nodeName')或者findall('nodeName')方法来查找指定tag的节点。

  • find('nodeName'):表示在该节点下,查找其中第一个tag为nodeName的节点。
  • findall('nodeName'):表示在该节点下,查找其中所有tag为nodeName的节点。

删除指定的节点以及保存

在合并Manifest文件的时候,可能有一些重复的权限,那么怎么删除掉呢,删除指定节点可以通过remove(node)方法,移除指定的节点。

<think>好的,我现在需要帮助用户解决如何使用Python解析XML的问题。根据用户提供的引用内容,我需要整理出不同的方法,并给出代码示例。 首先,用户提到的引用中有SAX、ElementTree和DOM这三种方法。我需要分别介绍这三种方法,确保每种方法的说明清晰,并附上代码示例。 对于SAX解析,引用1和2提到它是基于事件驱动的,适合处理大文件。我需要写一个简单的示例,展示如何创建解析器、定义处理类,并解析XML文件。注意代码的正确性,比如使用xml.sax中的ContentHandler。 然后是ElementTree方法,引用2、3、4都提到了ElementTree模块,尤其是xml.etree.ElementTree。我需要展示如何用ET.parse加载文件,获取根节点,遍历子元素。可能还需要展示遍历和查找特定标签的代码,比如遍历所有province元素。 DOM方法虽然用户没有直接引用,但常见于XML解析,所以应该包含。需要说明它是将整个文档加载到内存,适合小文件,并给出使用xml.dom.minidom的示例,比如获取根节点和元素列表。 用户可能需要比较不同方法的优缺点,所以应该在最后总结三种方法的适用场景,比如SAX适合大文件,DOM适合小文件需要随机访问,ElementTree简单易用。 此外,用户要求生成相关问题,我需要根据解析XML的方法想到可能的相关问题,比如性能比较、处理大型XML的最佳实践、如何修改XML文件等。 需要确保代码格式正确,使用三个反引号包裹,并注明语言。同时,检查LaTeX语法是否正确,但用户的问题中没有数学表达式,所以可能不需要使用。不过按照系统指令,如果有行内数学内容的话需要用$...$,但这里可能不需要。 最后,确保回答结构清晰,分点说明每种方法,代码示例正确,并在末尾添加相关问题。引用标识要正确对应,比如[^1][^2][^3][^4]来自用户提供的引用内容,但实际回答中可能不需要具体引用,因为用户的问题是关于代码示例,而引用内容中的信息可以作为方法介绍的参考。</think>### Python实现XML解析的三种方法及示例代码 根据XML解析的特点和Python标准库支持,以下是三种主流方法的具体实现(基于引用[2][3][4]的模块说明): #### 一、SAX解析(事件驱动) ```python import xml.sax class ProvinceHandler(xml.sax.ContentHandler): def startElement(self, name, attrs): if name == "province": print("省份:", attrs["name"]) def startElement(self, name, attrs): if name == "city": print("城市:", attrs["name"]) parser = xml.sax.make_parser() parser.setContentHandler(ProvinceHandler()) parser.parse("provinces.xml") ``` *特点:流式读取,内存占用低,适合大文件解析[^2]* #### 二、ElementTree解析(DOM优化) ```python import xml.etree.ElementTree as ET tree = ET.parse('provinces.xml') root = tree.getroot() # 遍历所有省份 for province in root.findall('province'): print(f"省份:{province.attrib['name']}") # 遍历子城市 for city in province.findall('city'): print(f"-- 城市:{city.attrib['name']}") ``` #### 三、DOM解析(完整文档对象) ```python from xml.dom import minidom doc = minidom.parse("provinces.xml") provinces = doc.getElementsByTagName("province") for p in provinces: print("省份:", p.getAttribute("name")) cities = p.getElementsByTagName("city") for c in cities: print("-- 城市:", c.getAttribute("name")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值