0
点赞
收藏
分享

微信扫一扫

python 标准库之 xml.etree.ElementTree

一葉_code 04-08 13:00 阅读 1
python

简介

<tag attrib1=1>text</tag>tail
  1     2        3         4

导入ElementTree

from xml.etree import ElementTree as ET
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

 XML是中结构化数据形式,在ET中使用ElementTree代表整个XML文档,并视其为一棵树,Element代表这个文档树中的单个节点。


 Element中的遍历与查询

Element.iter(tag=None):遍历该Element所有后代,也可以指定tag进行遍历寻找。

Element.findall(path):查找当前元素下tag或path能够匹配的直系节点。

Element.find(path):查找当前元素下tag或path能够匹配的首个直系节点。

Element.text: 获取当前元素的text值。

Element.get(key, default=None):获取元素指定key对应的属性值,如果没有该属性,则返回default值。
 Element对象 
class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

  tag:string,元素代表的数据种类。
  text:string,元素的内容。
  tail:string,元素的尾形。
  attrib:dictionary,元素的属性字典。
  
  #针对属性的操作
  clear():清空元素的后代、属性、text和tail也设置为None。
  get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
  items():根据属性字典返回一个列表,列表元素为(key, value)。
  keys():返回包含所有元素属性键的列表。
  set(key, value):设置新的属性键与值。

  #针对后代的操作
  append(subelement):添加直系子元素。
  extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
  find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
  findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
  findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
  insert(index, element):在指定位置插入子元素。
  iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
  iterfind(match):根据tag或path查找所有的后代。
  itertext():遍历所有后代并返回text值。
  remove(subelement):删除子元素。

 ElementTree对象
class xml.etree.ElementTree.ElementTree(element=None, file=None)
element如果给定,则为新的ElementTree的根节点。  
setroot(element):用给定的element替换当前的根节点。慎用。

# 以下方法与Element类中同名方法近似,区别在于它们指定以根节点作为操作对象。  
find(match)  
findall(match)  
findtext(match, default=None)  
getroot():获取根节点  
iter(tag=None)
iterfind(match)  
parse(source, parser=None):装载xml对象,source可以为文件名或文件类型对象.  

write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None,method="xml")

 模块方法&案例

案例一

下面是一个简单的例子,展示了如何使用 xml.etree.ElementTree 模块来创建一个 XML 文档:

import xml.etree.ElementTree as ET

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

# 创建子元素
child1 = ET.SubElement(root, "child1")
child1.text = "This is child 1"

child2 = ET.SubElement(root, "child2")
child2.text = "This is child 2"

# 创建一个 XML 文档对象
tree = ET.ElementTree(root)

# 将 XML 写入文件
with open("example.xml", "wb") as f:
    tree.write(f)

案例二
content = """
    <data>
        <country name="Liechtenstein" id ="123">
            <rank updated="yes">2</rank>
            <year>2023</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria"/>
            <neighbor direction="w" name="Switzerland"/>
        </country>
        <country name="Panlma">
            <rank updated="yes">69</rank>
            <year>2026</year>
            <gdppc>13600</gdppc>
            <neighbor direction="w" name="Costa Rica"/>
            <neighbor direction="E" name="Colombia"/>
        </country>
    </data>
"""

root = ET.XML(content) # 加载数据
country_object = root.find("country") # 在加载的数据root里,寻找country标签
print(country_object.tag, country_object.attrib) # 打印 country_object 的标签名称和属性

year_object = country_object.find("year")
print(year_object.tag, year_object.attrib, year_object.text)


for child in root.iter("year"): # root.iter("year") 在root数据中,寻找所有year标签
    print(child.tag, child.attrib, child.text)


v1 = root.findall("country")  # 寻找所有 country 标签
print(v1)

v2 = root.find("country").find("year")  # 寻找第一个contry标签中的所有year标签
print(v2.text)


rank = root.find("country").find("rank")
rank.text = "flag{123456}"
rank.set('update', '2024-4-7')
print(rank.tag, rank.attrib, "\ndata:", rank.text)

tree = ET.ElementTree(root)
tree.write("my_directory/file_2.html", encoding="utf-8") # 保存操作!

构建xml文档
# 构建xml文档

#第一种创建xml文件方式
from xml.etree import ElementTree as ET

# 创建根标签
root = ET.Element("home")

# 创建一标签
son1 = ET.Element("son", {'name': '小绿'})
# 创建二标签
son2 = ET.Element("son", {'name': '小白'})

# 在一标签内创建两个小标签
grandson1 = ET.Element('grandson', {'name': 'a'})
grandson2 = ET.Element('grandson', {'name': 'b'})
# 将两个孙子标签添加到 son1 标签内
son1.append(grandson1)
son1.append(grandson2)

# 把两个 son 标签添加到根节点内
root.append(son1)
root.append(son2)

# 创建 ElementTree 对象,并将根元素 root 传递给它
tree = ET.ElementTree(root)

# 写入文件
tree.write('my_directory/new_file.xml', encoding='utf-8', short_empty_elements=False)


"""输出:
<home>
    <son name="小绿">
        <grandson name="a"></grandson>
        <grandson name="b"></grandson>
    </son>
    <son name="小白"></son>
</home>

"""

# 第二种创建xml文件方式
from xml.etree import ElementTree as ET

# 创建根节点
root = ET.Element("famliy")

# 创建大儿子
son1 = root.makeelement('son', {'name': '大儿子'})
# 创建小儿子
son2 = root.makeelement('son', {'name': '小儿子'})

# 在大儿子标签里面创建两个孙子
grandson1 = son1.makeelement('grandson', {'name': '大孙子'})
grandson2 = son1.makeelement('grandson', {'name': '小孙子'})
son1.append(grandson1)
son1.append(grandson2)

# 把儿子添加到跟节点
root.append(son1)
root.append(son2)

tree = ET.ElementTree(root)
tree.write('my_directory/new_file_2.xml', encoding='utf-8')

"""输出:
<famliy>
    <son name="大儿子">
        <grandson name="大孙子"/>
        <grandson name="小孙子"/>
    </son>
    <son name="小儿子"/>
</famliy>

"""
from xml.etree import ElementTree as ET

root = ET.Element("famliy")

son1 = ET.SubElement(root, "son", attrib={"name": "son1"})
son2 = ET.SubElement(root, "son", attrib={"name": "son2"})

grandson1 = ET.SubElement(son1, "age", attrib={"name": "sun1"})
grandson1.text = "孙子"

et = ET.ElementTree(root) # 生成文档对象
et.write("my_directory/new_file_3.xml", encoding="utf-8")

"""输出:
<famliy>
    <son name="son1">
        <age name="sun1">孙子</age>
    </son>
    <son name="son2"/>
</famliy>
"""

构建一个 XML 文档,需要使用  xml.etree.ElementTree  模块中的类和函数。下面一个示例,演示了如何构建一个包含多个元素和属性的 XML 文档:

import xml.etree.ElementTree as ET

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

# 创建子元素并添加到根元素中
child1 = ET.SubElement(root, "child1")
child1.text = "This is child 1"
child1.set("attribute", "value1")

child2 = ET.SubElement(root, "child2")
child2.text = "This is child 2"

# 创建第二层子元素
subchild = ET.SubElement(child2, "subchild")
subchild.text = "This is a subchild"

# 创建一个 XML 文档对象
tree = ET.ElementTree(root)

# 将 XML 写入文件
with open("example.xml", "wb") as f:
    tree.write(f)

以上代码将创建如下结构的 XML 文档:

<root>
    <child1 attribute="value1">This is child 1</child1>
    <child2>This is child 2<subchild>This is a subchild</subchild></child2>
</root>

这个例子中,我们创建了一个根元素 "root",并向其添加了两个子元素  "child1"  和  "child2" 。其中  "child1"  具有一个名为  "attribute"  的属性,并包含文本内容。 "child2"  具有一个名为 "subchild"  的子元素,并包含文本内容。最后,我们将整个 XML 文档写入到文件  "example.xml"  中。

举报

相关推荐

0 条评论