Python xml.etree.ElementTree 用法

import xml.etree.ElementTree as et

parser = et.parse("data.xml");
root = parser.getroot();
addr = et.Element("addr");
addr.text="Beijing";
cellular=et.Element("cellular");
cellular.text="187313211001";

list_Element=[addr,cellular];

for item in range(len(root)):
    root[item].extend(list_Element);

parser.write("data.xml",encoding="utf-8");

操作数据的源文件XML

<students>
    <student no="2009081097">
        <name nickname="apple">jack</name>
        <gender>M</gender>
        <age updated="yes">89</age>
        <score subject="math">97</score>
        <score subject="chinese">90</score>
    </student>
    <student no="2009081098">
        <name nickname="apple">sunny</name>
        <gender>W</gender>
        <age updated="yes">90</age>
        <score subject="math">87</score>
        <score subject="chinese">96</score>
    </student>
    <student no="2009081099">
        <name nickname="apple">Anna</name>
        <gender>M</gender>
        <age updated="yes">88</age>
        <score subject="math">64</score>
        <score subject="chinese">98</score>
    </student>
</students>

__author__ = 'sandy'
#_*_coding:utf-8_*_

import xml.etree.cElementTree as et
import xml.etree.ElementTree as ets





#解析文件
parser = et.parse("data.xml");

#获取根节点
root = parser.getroot();
#获取标签名字
print root.tag
#获取属性
attr = root.attrib;
#通过索引访问节点
print root[0][0].text;

#查找根目录下面的子元素
for name in root.findall("student"):
    #查找一个具体的元素
    print name.find("age").get("updated");
    #获取属性
    print name.get("no");


#获取student元素
#更改student.age年龄
#获取name设置属性
#写入文档
for child in root.iter("student"):
    new_age = int(child.find("age").text)+10;
    child.find("age").text = str(new_age);
    child.find("name").set("nickname","apple");
parser.write("data.xml");

#查找根目录下面的子元素
#查找age
#如果大于age删除元素
#写入文档
for offspring in root.findall("student"):
    age = int(offspring.find("age").text);
    if(age > 60):
        root.remove(offspring);

parser.write("data.xml");


#创建元素
father = et.Element("father");
father.text = "Jason";
son = et.SubElement(father,"son");
son.text = "Lan";
daughter=et.SubElement(father,"daughter");
daughter.text="sunny";

print et.dump(father);


exit();
#迭代属性
for child in root:
    print ("iterator node name is {} , attr is {}").format(child.tag,child.attrib);





for student in root.findall('student'):
    id = student.get("no");
    name = student.find("name").text;
    print (id,name)


for age in root.iter('age'):
    new_age = int(age.text)+1
    age.text = str(new_age);
    age.set('updated','yes')
parser.write("data.xml");



for name in root.iter("student"):

    #print name.tag;
    print name.attrib["no"];

#_*_coding:utf-8_*_
import xml.etree.ElementTree as et




father = et.Element("father");
father.text = "Jason";
son = et.SubElement(father,"son");
son.text = "Lan";
daughter=et.SubElement(father,"daughter");
daughter.text="sunny";
#print et.dump(father);


#类似获取根节点
root = et.ElementTree(father);
#写入文件 用什么编码 是否要申明头部文件
root.write("student.xml",encoding="utf-8",xml_declaration=True);


#添加子节点
hobby = et.Element("hobby");
hobby.text="C++"
address = et.Element("Address");
address.text="NewYork";

list_Element = [hobby,address];
#扩展子节点
root[0].extend(list_Element);
#写入文档数据
parser.write("data.xml");


#迭代内部文本数据
#for item in root.itertext():
#    print item;

for item in root.iter("student"):
    #获取所有的ID值
    print item.keys();
    #获取所有的Key/name
    print item.items();
parser = et.parse("data.xml");

root = parser.getroot();

#clear all subElement
root.clear();

parser.write("data.xml");



import xml.etree.ElementTree as et

parser = et.parse("data.xml");
root = parser.getroot();
addr = et.Element("addr");
addr.text="Beijing";
cellular=et.Element("cellular");
cellular.text="187313211001";

list_Element=[addr,cellular];

for item in range(len(root)):
    root[item].extend(list_Element);

parser.write("data.xml",encoding="utf-8");


#_*_ coding:utf-8 _*_

import xml.etree.ElementTree as et

parser = et.parse("data.xml");

root = parser.getroot();

#查找元素并且迭代出来 只能迭代A-下面的儿子的元素 这个函数 Python2.7才有
for item in root.iterfind("name"):
    print item;


<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、付费专栏及课程。

余额充值