Python xml.etree.ElementTree.Element 对象

代码拆解

python 复制代码
element_tree = ET.parse(os.path.join(dirpath_element, file))  # 1. 解析XML文件
root = element_tree.getroot()                                 # 2. 获取根元素
Obj = root.find(element)                                      # 3. 查找子元素 → Obj

Obj 是什么?

Obj 是一个 xml.etree.ElementTree.Element 对象,表示找到的第一个匹配元素。

python 复制代码
import xml.etree.ElementTree as ET
import os

# 假设文件内容:
# <library>
#     <book id="001"><title>三体</title></book>
#     <book id="002"><title>流浪地球</title></book>
# </library>

element_tree = ET.parse('books.xml')
root = element_tree.getroot()      # root 是 <library> 元素

# 假设 element = 'book'
element = 'book'
Obj = root.find(element)           # Obj 是第一个 <book> 元素

print(type(Obj))                   # <class 'xml.etree.ElementTree.Element'>
print(Obj)                         # <Element 'book' at 0x...>
print(Obj.tag)                     # 'book'
print(Obj.attrib)                  # {'id': '001'}
print(Obj.find('title').text)      # '三体'

核心属性与方法

Obj 作为 Element 对象,包含:

属性/方法 说明 示例
Obj.tag 标签名 'book'
Obj.attrib 属性字典 {'id': '001'}
Obj.text 文本内容 None'内容'
Obj.tail 结束标签后的文本 通常 None
Obj.find('tag') 查找第一个子元素 返回 Element 或 None
Obj.findall('tag') 查找所有匹配子元素 返回列表
Obj.iter() 递归遍历所有后代 生成器
Obj.get('attr') 获取属性值 '001'
Obj.set('attr', 'val') 设置属性 修改XML
Obj.items() 获取所有属性 [('id', '001')]
list(Obj) 获取所有直接子元素 [<Element>, ...]

完整示例

python 复制代码
import xml.etree.ElementTree as ET

xml_content = '''<?xml version="1.0"?>
<library location="北京">
    <book id="001" category="科幻">
        <title>三体</title>
        <author>刘慈欣</author>
        <price>59.00</price>
    </book>
    <book id="002" category="科幻">
        <title>流浪地球</title>
        <author>刘慈欣</author>
        <price>45.00</price>
    </book>
</library>
'''

# 写入临时文件测试
with open('test.xml', 'w', encoding='utf-8') as f:
    f.write(xml_content)

# 你的代码逻辑
dirpath_element = '.'
file = 'test.xml'
element = 'book'  # 要查找的标签名

element_tree = ET.parse(os.path.join(dirpath_element, file))
root = element_tree.getroot()
Obj = root.find(element)  # ← 查找第一个 <book>

# ========== Obj 的详细解析 ==========

print("=" * 50)
print(f"1. Obj 类型: {type(Obj)}")
print(f"2. Obj 标签: {Obj.tag!r}")
print(f"3. Obj 属性: {Obj.attrib}")
print(f"4. Obj 直接子元素数量: {len(list(Obj))}")

print("\n5. 遍历 Obj 的子元素:")
for child in Obj:
    print(f"   <{child.tag}>: {child.text!r}")

print("\n6. 获取特定子元素:")
title_elem = Obj.find('title')
print(f"   title_elem.text = {title_elem.text!r}")

print("\n7. 获取属性:")
print(f"   id = {Obj.get('id')}")
print(f"   category = {Obj.get('category')}")

print("\n8. items() 方法:")
print(f"   {Obj.items()}")

# 清理
import os
os.remove('test.xml')

输出:

复制代码
==================================================
1. Obj 类型: <class 'xml.etree.ElementTree.Element'>
2. Obj 标签: 'book'
3. Obj 属性: {'id': '001', 'category': '科幻'}
4. Obj 直接子元素数量: 3

5. 遍历 Obj 的子元素:
   <title>: '三体'
   <author>: '刘慈欣'
   <price>: '59.00'

6. 获取特定子元素:
   title_elem.text = '三体'

7. 获取属性:
   id = 001
   category = 科幻

8. items() 方法:
   [('id', '001'), ('category', '科幻')]

重要注意事项

1. 找不到元素时返回 None

python 复制代码
Obj = root.find('movie')  # XML 中没有 <movie>
print(Obj)                # None

# 必须先判断,否则报错
if Obj is not None:
    print(Obj.text)
else:
    print("未找到元素")

2. find() vs findall() 的区别

python 复制代码
# find() - 只返回第一个匹配
Obj = root.find('book')           # 第一个 <book> 元素
print(Obj.get('id'))              # '001'

# findall() - 返回所有匹配的列表
books = root.findall('book')      # [<book id="001">, <book id="002">]
print(len(books))                 # 2
for book in books:
    print(book.get('id'))         # '001', '002'

3. XPath 支持

python 复制代码
# 查找特定属性
Obj = root.find(".//book[@id='002']")  # id=002 的 book

# 查找任意位置的元素
Obj = root.find(".//author")           # 第一个 <author>(任意层级)

可视化结构

复制代码
element_tree (ElementTree 对象)
    └── getroot() → root (Element 对象: <library>)
            └── find('book') → Obj (Element 对象: 第一个 <book>)
                    ├── tag: 'book'
                    ├── attrib: {'id': '001', 'category': '科幻'}
                    ├── text: None(因为文本在子元素中)
                    └── 子元素列表:
                            ├── <title> → text: '三体'
                            ├── <author> → text: '刘慈欣'
                            └── <price> → text: '59.00'

总结

变量 类型 代表含义
element_tree ElementTree 整个 XML 文档树
root Element 根元素(如 <library>
Obj Element 找到的第一个匹配子元素

Obj 就是 XML 中的一个元素节点,你可以用它来:

  • 读取数据(Obj.text, Obj.get(), Obj.find()

  • 修改数据(Obj.set(), Obj.text = ...

  • 继续查找子元素(Obj.find(), Obj.findall()

  • 遍历子树(Obj.iter()

相关推荐
Moment16 小时前
Vibe Coding 时代,到底该选什么样的工具来提升效率❓❓❓
前端·后端·github
IT_陈寒18 小时前
SpringBoot性能飙升200%?这5个隐藏配置你必须知道!
前端·人工智能·后端
小时前端18 小时前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
Nicko19 小时前
Jetpack Compose BOM 2026.02.01 解读与升级指南
前端
小蜜蜂dry19 小时前
nestjs学习 - 控制器、提供者、模块
前端·node.js·nestjs
优秀稳妥的JiaJi19 小时前
基于腾讯地图实现电子围栏绘制与校验
前端·vue.js·前端框架
helloweilei19 小时前
python 抽象基类
python
前端开发呀19 小时前
从 qiankun(乾坤) 迁移到 Module Federation(模块联邦),对MF只能说相见恨晚!
前端
用户83562907805120 小时前
Python 实现 PPT 转 HTML
后端·python
没想好d20 小时前
通用管理后台组件库-10-表单组件
前端