xml介绍与解析,及xml库包使用

简介: xml介绍与解析,及xml库包使用

1 XML简单介绍

1.1 XML简单介绍

XML(eXtensible Markup Language):

可扩展标记语言:被设计用来传输存储数据

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同。

python有三种方法解析XML文件参考

  • SAX(simple API for XML)
  • DOM(Document Object Model):将XML数据映射到内存中(比较慢、耗内存),解析成一个树,通过对树的操作XML
  • ElementTree(元素树):ElementTree像一个轻量级的DOM,具有方便友好的API,大妈可用性好,速度快,内存消耗少。

1.2 XML语法结构

下面主要以ElementTree来讲解如何解析一个xml文件

2 XML.etree.ElementTree的使用

测试的xml文件:test.xml 数据如下:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
AI 代码解读

import xml.etree.ElementTree as ET

2.1 读取xml文件,然后返回根元素

ET.parse()接受参数可以是xml文件路径,也可以是读取xml的文件句柄

parse(source: {read}, parser: Any = None) -> ElementTree

  • ET.parse():接受参数为xml文件路径
    ```python
    import xml.etree.ElementTree as ET

tree = ET.parse('./test.xml')
root = tree.getroot()
print(type(root), root)

*  ET.parse():接受参数为读取xml的文件句柄
```python
import xml.etree.ElementTree as ET

tree = ET.parse(open('./test.xml'))
root = tree.getroot()
print(root)  
# <Element 'data' at 0x00000243ECFE5958>
AI 代码解读

2.2 获取子元素及子元素属性

作为元素Element,如果有子元素

  • 可以使用tag属性获取子元素名元素名字符串返回
  • 可以使用attrib属性获取子元素中定义的属性属性字典键值对返回
    for child in root:
      print(child.tag, child.attrib)
      print(type(child.tag), type(child.attrib))
    '''
    country {'name': 'Liechtenstein'}
    <class 'str'> <class 'dict'>
    country {'name': 'Singapore'}
    <class 'str'> <class 'dict'>
    country {'name': 'Panama'}
    <class 'str'> <class 'dict'>
    '''
    
    AI 代码解读

    2.3 获取元素标签中存储的数据

使用text属性可以获取元素标签存储数据,使用text属性返回的是字符串类型

print(root.tag)
print(root.attrib)  # 根标签元素中没有属性,因此返回一个空字典
print(root[0])
print(root[0].text, type(root[0].text))
print(root[0][1])
# root根元素的第一个子元素标签是country,然后country的子元素的第二个元素
print(root[0][1].text, type(root[0][1].text))
'''
data
{}
<Element 'country' at 0x0000018269E1F9A8>
         <class 'str'>
<Element 'year' at 0x00000274B9790A48>
2008 <class 'str'>
'''
AI 代码解读

2.4 查找指定元素标签中存储的数据

Element.iter() 方法可以递归遍历其下所有子树(包括子级、子级的子级等)

如下:递归的找到根元素下所有的 'neighbor'元素

for neighbor in root.iter('neighbor'):
    # print(neighbor.tag)  # 输出都是neighbor
    print(neighbor.attrib)
'''
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}
'''
AI 代码解读

1、查找指定元素中存储的数据

rootElement.find('childElement_name'):返回子元素中存储的数据,返回类型字符串

2、获取中元素的属性的属性值

rootElement.get('rootElementAttrib_name'):返回元素属性的值,返回类型字符串

for country in root.iter('country'):
    # 查找country元素下的子元素rank,然后输出rank元素中存储的值
    # contry.find('rank'):find()方法是查找country元素的子元素rank存储的值
    rank = country.find('rank').text
    print(type(rank), rank)
    # country.get('name'):get()方法是获取元素country中属性name对应的属性值
    name = country.get('name')
    print(type(name), name)

'''
<class 'str'> 1
<class 'str'> 4
<class 'str'> 68
'''
AI 代码解读

2.5 修改XML文件

2.5.1 修改xml文件

  • 修改元素存储数据:使用text属性
  • 修改元素的属性:使用Element.set()方法
    ```python
    for rank in root.iter('rank'):
    new_rank = int(rank.text) + 1 # rank元素标签中存储的值加1
    rank.text = str(new_rank) # 转换成字符串类型
    rank.set('update', 'yes') # 给rank元素设置属性 update="yes"

tree.write('output.xml')

修改之后的文件如下:
```python
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
AI 代码解读

2.5.1 删除xml文件中一些元素

Element.remove()删除元素。假设我们要删除排名高于50的所有国家/地区:

for country in root.findall('country'):
    rank = int(country.find('rank').text)
    if rank > 50:
        root.remove(country)

tree.write('output2.xml')
AI 代码解读

删除之后的结果如下:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>
AI 代码解读
目录
打赏
0
0
0
0
12
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
415 1
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
411 29
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
123 15
自己动手编写tcp/ip协议栈1:tcp包解析
学习tuntap中的tun的使用方法,并使用tun接口解析了ip包和tcp包,这是实现tcp/ip协议栈的第一步。
109 15
网页解析库:BeautifulSoup与Cheerio的选择
网页解析库:BeautifulSoup与Cheerio的选择
|
8月前
|
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
432 0
SQL整库导出语录:全面解析与高效执行策略
在数据库管理和维护过程中,整库导出是一项常见的需求,无论是为了备份、迁移还是数据分析,掌握如何高效、准确地导出整个数据库至关重要

推荐镜像

更多
  • DNS
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问