python 操作xml文件
在Python中操作XML文件通常使用内置的xml.etree.ElementTree模块,它提供了一个轻量级的API来解析和创建XML数据。以下是一些基本的操作示例,包括读取、修改和创建XML文件。
- 解析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}')
- 修改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')
- 创建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')
- 使用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)
- 处理命名空间
如果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)
- 处理属性
你可以轻松地访问和修改元素的属性。
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')
- 删除元素
你可以使用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')
- 处理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)
- 处理注释
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)
- 处理实体引用
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('&', '&')
return tree
# 使用自定义解析器解析XML文件
tree = parse_entities('example.xml')
root = tree.getroot()
# 处理实体引用
for elem in root.iter():
if elem.text:
print(elem.text)