Python读取xml文件(xml.etree.ElementTree)

# code reading xml file
import xml.etree.ElementTree as ET

tree = ET.parse('./test.xml')
root = tree.getroot()
for ob in root.iter('object'):
    for name in ob.iter('name'):
        print('name ',name.text)
    for pose in ob.iter('pose'):
        print('pose ',pose.text)
    for trun in ob.iter('truncated'):
        print('trun ', trun.text)
    for diff in ob.iter('difficult'):
        print('diff ', diff.text)
    for bndbox in ob.iter('bndbox'):
        for l in bndbox:
            print(l.text)
# result:
name  bottle
pose  Unspecified
trun  0
diff  0
288
224
330
328
# XML file for test
<annotation>
    <folder>VOC2007</folder>
    <filename>006500.jpg</filename>
    <source>
        <database>The VOC2007 Database</database>
        <annotation>PASCAL VOC2007</annotation>
        <image>flickr</image>
        <flickrid>319318625</flickrid>
    </source>
    <owner>
        <flickrid>El Mitch</flickrid>
        <name>?</name>
    </owner>
    <size>
        <width>500</width>
        <height>333</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>bottle</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>288</xmin>
            <ymin>224</ymin>
            <xmax>330</xmax>
            <ymax>328</ymax>
        </bndbox>
    </object>
</annotation>
<think>我们正在讨论Python中使用xml.etree.ElementTree库进行XML读写的方法。根据引用的内容,我们可以总结如下: 1. 读取XML文件: - 从文件读取:使用`ET.parse()`方法,然后通过`getroot()`获取根元素。 - 从字符串读取:使用`ET.fromstring()`方法直接得到根元素。 2. 遍历元素: - 根元素本身是一个Element对象,可以直接遍历其子元素。 - 可以通过`attrib`属性获取元素的属性(字典形式)。 - 可以通过`text`属性获取元素的文本内容。 3. 写入XML文件: - 虽然引用中没有直接给出写入的例子,但我们可以通过构建ElementTree对象,然后使用`write()`方法写入文件。 下面我将详细介绍读写操作的方法: ### 读取XML文件 #### 从文件读取 ```python import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse('filename.xml') # 获取根元素 root = tree.getroot() # 遍历根元素的所有子元素 for child in root: print(child.tag, child.attrib) # 打印子元素的标签和属性 # 遍历特定标签的元素 for elem in root.iter('tag_name'): print(elem.text) # 打印元素的文本内容 ``` #### 从字符串读取 ```python xml_data = '<root><element>Text</element></root>' root = ET.fromstring(xml_data) # 然后就可以像上面一样操作根元素 ``` ### 写入XML文件 #### 创建新的XML文件 ```python import xml.etree.ElementTree as ET # 创建根元素 root = ET.Element('root') # 创建子元素 child = ET.SubElement(root, 'child') child.text = 'This is a child element' # 创建ElementTree对象 tree = ET.ElementTree(root) # 写入文件 tree.write('output.xml', encoding='utf-8', xml_declaration=True) ``` #### 修改现有XML并保存 ```python # 假设我们已经解析了一个XML文件到tree对象 tree = ET.parse('filename.xml') root = tree.getroot() # 修改元素:例如修改第一个子元素的文本 for elem in root.iter('tag_to_modify'): elem.text = 'New Text' # 添加新元素 new_elem = ET.Element('new_element') new_elem.text = 'New element content' root.append(new_elem) # 删除元素 for elem in root.findall('element_to_remove'): root.remove(elem) # 保存修改 tree.write('modified.xml', encoding='utf-8', xml_declaration=True) ``` ### 注意事项 - 在写入XML文件时,如果需要声明(如<?xml version='1.0' encoding='utf-8'?>),则需设置`xml_declaration=True`。 - 默认情况下,写入文件时不会进行缩进,如果需要格式化的输出,可以自定义一个函数来进行缩进处理,或者使用第三方库(如`xml.dom.minidom`)来美化输出。 ### 美化输出(缩进) 由于`ElementTree`在写入时不会添加缩进,我们可以通过以下方式实现缩进: ```python def indent(elem, level=0): i = "\n" + level*" " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " if not elem.tail or not elem.tail.strip(): elem.tail = i for elem in elem: indent(elem, level+1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i # 使用示例 root = ET.Element('root') # ... 构建XML ... indent(root) tree = ET.ElementTree(root) tree.write('output.xml', encoding='utf-8', xml_declaration=True) ``` ### 查询元素 - `find(tag)`:查找第一个匹配的子元素。 - `findall(tag)`:查找所有匹配的子元素(直接子元素)。 - `iter(tag)`:递归遍历所有匹配的子元素(包括嵌套的)。 ### 总结 通过`xml.etree.ElementTree`库,我们可以方便地读取、修改和创建XML文档。主要步骤包括: 1. 解析XML:从文件或字符串中获取根元素。 2. 遍历和查询:使用迭代、`find`、`findall`等方法定位元素。 3. 修改:修改元素属性、文本,添加或删除元素。 4. 写入:将修改后的树写入文件,可以选择美化输出。 §§相关问题§§ 1. 如何使用xml.etree.ElementTree处理XML命名空间? 2. 如何美化xml.etree.ElementTree输出的XML格式? 3. xml.etree.ElementTree和lxml库在处理XML时有什么区别? 4. 如何用xml.etree.ElementTree解析大型XML文件以避免内存问题? </think>以下是Python中使用`xml.etree.ElementTree`库进行XML读写操作的详细指南,结合您提供的引用内容: ### 一、XML文件读取方法 1. **从文件读取**(推荐方式) 使用`ET.parse()`加载文件,再通过`getroot()`获取根节点: ```python import xml.etree.ElementTree as ET tree = ET.parse('country_data.xml') # 载入文件 root = tree.getroot() # 获取根节点 ``` 2. **从字符串读取** 直接解析XML字符串内容: ```python root = ET.fromstring(country_data_as_string) # 字符串转XML对象 ``` ### 二、数据遍历与提取 #### 基本遍历结构 ```python for doc in root: # 遍历根节点下的子节点 print("属性:", doc.attrib) # 获取节点属性 (如 {'ID': '4'}) for sent in doc: # 遍历子节点的子节点 print("子节点属性:", sent.attrib) # (如 {'ID': '1', 'label': '2'}) print("文本内容:", sent.text) # 获取节点文本 ``` #### 高效查询方法 ```python # 查询所有特定标签 for elem in root.iter('tag_name'): print(elem.text) # 查找第一个匹配的子节点 target = root.find('path/to/node') # 查找所有匹配的子节点 items = root.findall('category/item') ``` ### 三、XML文件写入与修改 1. **创建新XML文件** ```python root = ET.Element("root") # 创建根节点 child = ET.SubElement(root, "child") # 添加子节点 child.text = "文本内容" tree = ET.ElementTree(root) tree.write("new.xml", encoding='utf-8', xml_declaration=True) ``` 2. **修改现有XML** ```python tree = ET.parse('data.xml') root = tree.getroot() # 修改文本 for elem in root.iter('target_tag'): elem.text = "新文本" # 添加属性 elem.set("new_attr", "value") tree.write('modified.xml') # 保存修改 ``` ### 四、关键注意事项 1. **命名空间处理** 带命名空间的XML需显式声明: ```python ET.register_namespace('ns', 'http://example.com') ``` 2. **编码问题** 写入时务必指定编码: ```python tree.write("output.xml", encoding='utf-8', xml_declaration=True) ``` 3. **文件路径** Windows路径需使用原始字符串或双反斜杠: ```python tree = ET.parse(r'C:\data\file.xml') # 正确 ``` > 引用说明:以上方法基于Python标准库文档[^1],常见用例参考解析实践[^3][^4],错误处理经验参考[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值