网站首页 > java教程 正文
首先什么是xml?还是先看一下百度百科是怎么说的。
可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。
先来看一个简单的xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<book name="Guide">
<title>XML Developer's Guide</title>
<author>John Doe</author>
<price>44.95</price>
</book>
<!--这是注释的方法-->
<book>
<title>Midnight Rain</title>
<author>Jane Doe</author>
<price>5.95</price>
</book>
</data>
- 头声明<?xml version="1.0" encoding="UTF-8"?> 语法上可有可无,但是建议添加,能更明确的指明编码方式。
- 必须存在一个根标签,有且只能有一个。
- XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。
- 所有 XML 元素都必须有关闭标签,如 <item>...</item>, 或 <item attr="..."/>,标签名大小写敏感。
- XML 必须正确地嵌套,标签不能够交叉编写,例如:<a>内容1<b>内容2</a></b>,这种编写方式是错的。
- XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
- XML 元素可以在开始标签中包含属性,类似 HTML。属性 (Attribute) 提供关于元素的额外(附加)信息。
- 注释方法:<!--这是注释的方法-->,和HTML是一样的。
- 特殊字符要用实体转义,类似HTML,如 < 转义为 < 。
了解xml格式之后,那我们如何读写xml呢?就像其他格式一样,只要你了解这个格式的所有语法和用法,你就可以通过字符串解析和拼接的方式,读取和写入xml文件或字符串,当然这种方式特别不方便,那python有没有为我们提供类库呢?在Python中,处理XML文件主要依赖于几个常用库:
- xml.etree.ElementTree:Python标准库的一部分,轻量级且易于使用,适合大多数XML处理任务。
- minidom:Python标准库中的另一种XML解析器,基于DOM(Document Object Model)模型,适合需要对XML结构进行详细操作的场景。
- lxml:一个第三方库,基于libxml2和libxslt,支持XPath和XSLT,性能较高,适合处理大型或复杂的XML文件。
下面介绍一下如何利用 xml.etree.ElementTree 来读写xml。
# 如何解析xml
from xml.etree import ElementTree
# 解析xml字符串
str = '''<?xml version="1.0" encoding="UTF-8"?>
<data>
<book name="Guide">
<title>XML Developer's Guide</title>
<author>John Doe</author>
<price>44.95</price>
</book>
<!--这是注释的方法-->
<book>
<title>Midnight Rain</title>
<author>Jane Doe</author>
<price>5.95</price>
</book>
</data>
'''
et = ElementTree.fromstring(str)
print(et) #直接拿到根元素: <Element 'data' at 0x0000026038A60368>
# 解析xml文件
et = ElementTree.parse('demo.xml')
print(et) #<xml.etree.ElementTree.ElementTree object at 0x00000260389CC828>
# 获取根元素
root = et.getroot()
print(root) #<Element 'data' at 0x0000019FA97B0368>
# 获得子元素列表,已经废弃了,不建议使用
childList = root.getchildren()
print(childList) #[<Element 'book' at 0x000001D00AAA03B8>, <Element 'book' at 0x000001D00AAA04F8>]
# 一个元素就是一个可迭代对象,官方文档推荐这样直接迭代它
childList = list(root)
print(childList) #[<Element 'book' at 0x00000201108303B8>, <Element 'book' at 0x00000201108304F8>]
# 我们拿到第一个元素
c1 = childList[0] #<Element 'book' at 0x000001C1594703B8>
# 看一下都有什么属性
print(c1.attrib) #{'name': 'Guide'}
# 如果属性很多,想直接获取某一个属性
print(c1.get("name")) #Guide
# 获得作者
author = list(c1)[1].text
print(author) #John Doe
# 通过索引获取太不方便了,怎么通过名字获取 find 或findall
author = c1.find('author')
print(author.text) #John Doe
# 这是寻找子集元素,如果找下级所有的呢
print(list(root.iter('author')))
# 也可以通过xpath寻找,root.iterfind(xpath)
#如何写入xml
from xml.etree import ElementTree
# 创建元素
book = ElementTree.Element("book")
title = ElementTree.Element("title")
author = ElementTree.Element("author")
# 设置属性
title.set("name", "Guide")
# 设置text
title.text = "XML Developer's Guide"
author.text = "John Doe"
# 讲元素连接成树
book.append(title)
book.append(author)
print(ElementTree.dump(book))
#<book><title name="Guide">XML Developer's Guide</title><author>John Doe</author></book>
# 还可以使用SubElement直接创建子元素,更简洁
book = ElementTree.Element("book")
title = ElementTree.SubElement(book, 'title')
title.set("name", "Guide")
print(ElementTree.dump(book))
# <book><title name="Guide" /></book>
# Element 转为 ElementTree
et = ElementTree.ElementTree(book)
# 写入文件
et.write('test.xml', encoding='utf8')
xml.etree.ElementTree是处理XML文件的首选库,因其轻量级和易用性,适合大多数XML读写任务。
猜你喜欢
- 2024-11-10 Spring 基于 XML 的 IOC(spring xml map)
- 2024-11-10 阿里P7大神,Java学习之路-IO流与XML,超赞分享
- 2024-11-10 如何用Ajax解析json,XML数据格式
- 2024-11-10 Python和XML(python)
- 2024-11-10 Qt开发-流方法解析XML(qt读取文件流)
- 2024-11-10 Kettle(PDI)转换中输出之XML输出详解
- 2024-11-10 Java代码审计之不安全的Java代码(java安全点有哪些)
- 2024-11-10 spring boot Mybatis Mapper.xml使用总结
- 2024-11-10 Redis基本数据结构之字符串(redis的字符串类型是怎样实现的)
- 2024-11-10 Tomcat Server.xml配置详解(tomcat service配置)
你 发表评论:
欢迎- 05-23Java线程池:核心参数与最佳实践
- 05-23深入理解 Java 的线程池原理
- 05-23面试突击34:如何使用线程池执行定时任务?
- 05-23Java线程池核心参数调优指南:掌控并发世界的钥匙
- 05-23Java线程池:优雅管理并发任务的艺术
- 05-23一篇文章快速搞懂Java中常用的四种线程池
- 05-23Java线程池工作原理深度解读:从创建到任务执行的全过程
- 05-23一文看懂:Java线程池任务拒绝机制解析
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)