当前位置: 首页 > article >正文

python 操作xml文件

在Python中操作XML文件通常使用内置的xml.etree.ElementTree模块,它提供了一个轻量级的API来解析和创建XML数据。以下是一些基本的操作示例,包括读取、修改和创建XML文件。

  1. 解析XML文件
    首先,我们来看如何解析一个XML文件并读取其中的数据。
import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 遍历根元素的所有子元素
for child in root:
    print(f'Tag: {child.tag}, Attributes: {child.attrib}')
    for subchild in child:
        print(f'  SubTag: {subchild.tag}, Text: {subchild.text}')
  1. 修改XML文件
    接下来,我们来看如何修改XML文件中的数据。
import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 修改某个元素的文本内容
for elem in root.iter('tagname'):
    elem.text = 'new value'

# 添加一个新元素
new_elem = ET.Element('newtagname')
new_elem.text = 'new element text'
root.append(new_elem)

# 保存修改后的XML文件
tree.write('modified_example.xml')
  1. 创建XML文件
    我们还可以从头开始创建一个新的XML文件。
import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element('root')

# 创建子元素
child1 = ET.SubElement(root, 'child1')
child1.text = 'child1 text'

child2 = ET.SubElement(root, 'child2')
child2.text = 'child2 text'

# 创建孙元素
subchild = ET.SubElement(child2, 'subchild')
subchild.text = 'subchild text'

# 创建ElementTree对象并写入文件
tree = ET.ElementTree(root)
tree.write('new_example.xml')
  1. 使用XPath查找元素
    ElementTree还支持XPath表达式来查找元素。
import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 使用XPath查找所有符合条件的元素
for elem in root.findall('.//tagname'):
    print(elem.text)
  1. 处理命名空间
    如果XML文件中包含命名空间,处理起来会稍微复杂一些。
import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 定义命名空间
namespaces = {'ns': 'http://www.example.com/namespace'}

# 使用命名空间查找元素
for elem in root.findall('.//ns:tagname', namespaces):
    print(elem.text)
  1. 处理属性
    你可以轻松地访问和修改元素的属性。
import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 访问属性
for elem in root.iter('tagname'):
    print(elem.attrib['attribute_name'])

# 修改属性
for elem in root.iter('tagname'):
    elem.attrib['attribute_name'] = 'new value'

# 保存修改后的XML文件
tree.write('modified_example.xml')
  1. 删除元素
    你可以使用remove()方法删除元素。
import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 删除特定元素
for elem in root.findall('tagname'):
    root.remove(elem)

# 保存修改后的XML文件
tree.write('modified_example.xml')
  1. 处理CDATA部分
import xml.etree.ElementTree as ET

class CDataElement(ET.Element):
    def __init__(self, tag, attrib={}, **extra):
        super().__init__(tag, attrib, **extra)
        self.text = None
        self.tail = None

def parse_cdata(source):
    tree = ET.parse(source)
    root = tree.getroot()
    for elem in root.iter():
        if elem.text and elem.text.startswith('<![CDATA[') and elem.text.endswith(']]>'):
            elem.text = elem.text[9:-3]
    return tree

# 使用自定义解析器解析XML文件
tree = parse_cdata('example.xml')
root = tree.getroot()

# 处理CDATA部分
for elem in root.iter():
    if elem.text:
        print(elem.text)
  1. 处理注释
    ElementTree默认不支持直接处理注释,但你可以通过自定义解析器来实现。
import xml.etree.ElementTree as ET

class CommentElement(ET.Element):
    def __init__(self, tag, attrib={}, **extra):
        super().__init__(tag, attrib, **extra)
        self.text = None
        self.tail = None

def parse_comments(source):
    tree = ET.parse(source)
    root = tree.getroot()
    for elem in root.iter():
        if elem.text and elem.text.startswith('<!--') and elem.text.endswith('-->'):
            elem.text = elem.text[4:-3]
    return tree

# 使用自定义解析器解析XML文件
tree = parse_comments('example.xml')
root = tree.getroot()

# 处理注释
for elem in root.iter():
    if elem.text:
        print(elem.text)
  1. 处理实体引用
    ElementTree默认不支持直接处理实体引用,但你可以通过自定义解析器来实现。
import xml.etree.ElementTree as ET

class EntityElement(ET.Element):
    def __init__(self, tag, attrib={}, **extra):
        super().__init__(tag, attrib, **extra)
        self.text = None
        self.tail = None

def parse_entities(source):
    tree = ET.parse(source)
    root = tree.getroot()
    for elem in root.iter():
        if elem.text and '&' in elem.text:
            elem.text = elem.text.replace('&', '&amp;')
    return tree

# 使用自定义解析器解析XML文件
tree = parse_entities('example.xml')
root = tree.getroot()

# 处理实体引用
for elem in root.iter():
    if elem.text:
        print(elem.text)

http://www.kler.cn/a/469876.html

相关文章:

  • uniapp 微信小程序 自定义日历组件
  • 数值分析速成复习笔记
  • 图漾相机基础操作
  • ECCV`24 | 首次解决文本到3D NeRFs分解问题!港中文等提出DreamDissector
  • 【大数据】(选修)实验4 安装熟悉HBase数据库并实践
  • 深入理解 JavaScript 立即执行函数表达式(IIFE)
  • 5G工业路由器品牌,5G赋能,重塑工业路由器新标杆
  • LabVIEW项目如何选择数据库
  • 【shell编程】报错信息:Redirection Error(包含7种解决方法)
  • 【记录】Angr|Angr 的 call_state 是怎么保证不同架构的函数的参数正常传递进去的?
  • 古玩玉器交易系统|Java|SSM|VUE| 前后端分离
  • 云服务器+docker配置Java程序运行环境
  • VUE3组合式——响应式数据ref、reactive
  • Javascript算法——贪心算法(一)
  • jupyter出现“.ipynb appears to have died. It will restart automatically.”解决方法
  • 函数指针的用法
  • 反射能做什么
  • php Yii2 Excel导出图片资源到表格
  • WebAssembly(WASM) + Python: 构建高性能跨平台Web应用
  • 自定义校验注解
  • 文件上传漏洞 (网络安全)
  • Pytest 接口关联
  • 肘部法则确定聚类数
  • nginx: [emerg] host not found in upstream “host.docker.internal“
  • MPLS动态LSP配置实验
  • hot100_73. 矩阵置零