Python实现XML文件解析建议收藏

1.XML简介XML(eXtensibleMarkupLanguage)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Python实现XML文件解析建议收藏此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

1. XML简介

  XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性。

  test.XML文件 

<?xml version="1.0" encoding="utf-8"?>
<catalog>
    <maxid>4</maxid>
    <login username="pytest" passwd='123456'>
        <caption>Python</caption>
        <item id="4">
            <caption>测试</caption>
        </item>
    </login>
    <item id="2">
        <caption>Zope</caption>
    </item>
</catalog>

  XML详细介绍可以参考:http://www.w3school.com.cn/xmldom/dom_nodetype.asp

2. XML文件解析

  python解析XML常见的有三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合;二是xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。

2.1 xml.dom.*

  文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。一个 DOM 的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。python中用xml.dom.minidom来解析xml文件。

  a. 获得子标签   

  b. 区分相同标签名的标签

  c. 获取标签属性值

  d. 获取标签对之间的数据

#coding=utf-8

#通过minidom解析xml文件
import xml.dom.minidom as xmldom
import os
''' 
XML文件读取 
<?xml version="1.0" encoding="utf-8"?>
<catalog>
    <maxid>4</maxid>
    <login username="pytest" passwd='123456'>dasdas
        <caption>Python</caption>
        <item id="4">
            <caption>测试</caption>
        </item>
    </login>
    <item id="2">
        <caption>Zope</caption>
    </item>
</catalog>

'''

xmlfilepath = os.path.abspath("test.xml")
print ("xml文件路径:", xmlfilepath)

# 得到文档对象
domobj = xmldom.parse(xmlfilepath)
print("xmldom.parse:", type(domobj))
# 得到元素对象
elementobj = domobj.documentElement
print ("domobj.documentElement:", type(elementobj))

#获得子标签
subElementObj = elementobj.getElementsByTagName("login")
print ("getElementsByTagName:", type(subElementObj))

print (len(subElementObj))
# 获得标签属性值
print (subElementObj[0].getAttribute("username"))
print (subElementObj[0].getAttribute("passwd"))

#区分相同标签名的标签
subElementObj1 = elementobj.getElementsByTagName("caption")
for i in range(len(subElementObj1)):
    print ("subElementObj1[i]:", type(subElementObj1[i]))
    print (subElementObj1[i].firstChild.data)  #显示标签对之间的数据

  输出结果:

>>> D:\Pystu>python xml_instance.py
>>> xml文件路径: D:\Pystu\test.xml
>>> xmldom.parse: <class 'xml.dom.minidom.Document'>
>>> domobj.documentElement: <class 'xml.dom.minidom.Element'>
>>> getElementsByTagName: <class 'xml.dom.minicompat.NodeList'>
>>> username: pytest
>>> passwd: 123456
>>> subElementObj1[i]: <class 'xml.dom.minidom.Element'>
>>> Python
>>> subElementObj1[i]: <class 'xml.dom.minidom.Element'>
>>> 测试
>>> subElementObj1[i]: <class 'xml.dom.minidom.Element'>
>>> Zope

2.2 xml.etree.ElementTree

  ElementTree生来就是为了处理XML,它在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。

  a. 遍历根节点的下一层   

  b. 下标访问各个标签、属性、文本

  c. 查找root下的指定标签

  d. 遍历XML文件

  e. 修改XML文件

#coding=utf-8 #通过解析xml文件 ''' try: import xml.etree.CElementTree as ET except: import xml.etree.ElementTree as ET 从Python3.3开始ElementTree模块会自动寻找可用的C库来加快速度 ''' import xml.etree.ElementTree as ET import os import sys ''' XML文件读取 <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>4</maxid> <login username="pytest" passwd='123456'>dasdas <caption>Python</caption> <item id="4"> <caption>测试</caption> </item> </login> <item id="2"> <caption>Zope</caption> </item> </catalog> ''' #遍历xml文件 def traverseXml(element): #print (len(element)) if len(element)>0: for child in element: print (child.tag, "----", child.attrib) traverseXml(child) #else: #print (element.tag, "----", element.attrib) if __name__ == "__main__": xmlFilePath = os.path.abspath("test.xml") print(xmlFilePath) try: tree = ET.parse(xmlFilePath) print ("tree type:", type(tree)) # 获得根节点 root = tree.getroot() except Exception as e: #捕获除与程序退出sys.exit()相关之外的所有异常 print ("parse test.xml fail!") sys.exit() print ("root type:", type(root)) print (root.tag, "----", root.attrib) #遍历root的下一层 for child in root: print ("遍历root的下一层", child.tag, "----", child.attrib) #使用下标访问 print (root[0].text) print (root[1][1][0].text) print (20 * "*") #遍历xml文件  traverseXml(root) print (20 * "*") #根据标签名查找root下的所有标签 captionList = root.findall("item") #在当前指定目录下遍历 print (len(captionList)) for caption in captionList: print (caption.tag, "----", caption.attrib, "----", caption.text) #修改xml文件,将passwd修改为999999 login = root.find("login") passwdValue = login.get("passwd") print ("not modify passwd:", passwdValue) login.set("passwd", "999999") #修改,若修改text则表示为login.text print ("modify passwd:", login.get("passwd")) 

  输出结果:

>>> D:\Pystu\test.xml >>> tree type: <class 'xml.etree.ElementTree.ElementTree'> >>> root type: <class 'xml.etree.ElementTree.Element'> >>> catalog ---- {} >>> 遍历root的下一层 maxid ---- {} >>> 遍历root的下一层 login ---- {'username': 'pytest', 'passwd': '123456'} >>> 遍历root的下一层 item ---- {'id': '2'} >>> 4 >>> 测试 >>> ******************** >>> maxid ---- {} >>> login ---- {'username': 'pytest', 'passwd': '123456'} >>> caption ---- {} >>> item ---- {'id': '4'} >>> caption ---- {} >>> item ---- {'id': '2'} >>> caption ---- {} >>> ******************** >>> 1 >>> item ---- {'id': '2'} ---- >>> not modify passwd: 123456 >>> modify passwd: 999999

  附:

Python实现XML文件解析建议收藏
Python实现XML文件解析建议收藏

#coding=utf-8 ''' XML解析类 @功能-结点的增删改查 ''' import xml.etree.ElementTree as ET import sys import os.path class XmlParse: def __init__(self, file_path): self.tree = None self.root = None self.xml_file_path = file_path def ReadXml(self): try: print("xmlfile:", self.xml_file_path) self.tree = ET.parse(self.xml_file_path) self.root = self.tree.getroot() except Exception as e: print ("parse xml faild!") sys.exit() else: print ("parse xml success!") finally: return self.tree def CreateNode(self, tag, attrib, text): element = ET.Element(tag, attrib) element.text = text print ("tag:%s;attrib:%s;text:%s" %(tag, attrib, text)) return element def AddNode(self, Parent, tag, attrib, text): element = self.CreateNode(tag, attrib, text) if Parent: Parent.append(element) el = self.root.find("lizhi") print (el.tag, "----", el.attrib, "----", el.text) else: print ("parent is none") def WriteXml(self, destfile): dest_xml_file = os.path.abspath(destfile) self.tree.write(dest_xml_file, encoding="utf-8",xml_declaration=True) if __name__ == "__main__": xml_file = os.path.abspath("test.xml") parse = XmlParse(xml_file) tree = parse.ReadXml() root = tree.getroot() print (root) parse.AddNode(root, "Python", {"age":"22", "hello":"world"}, "YES") parse.WriteXml("testtest.xml")

View Code

2.3 xml.sax.*

  SAX是一种基于事件驱动的API,利用SAX解析XML牵涉到两个部分:解析器和事件处理器。

  解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件

  事件处理器则负责对事件作出相应,对传递的XML数据进行处理

  常用场景:

    (1)对大型文件进行处理

    (2)只需文件的部分内容,或只需从文件中得到特定信息

    (3)想建立自己的对象模型

  基于事件驱动的SAX解析XML内容的知识后续补充!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120214.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Linux C语言写的超级简单port扫描器

    Linux C语言写的超级简单port扫描器

    2021年12月15日
  • java常量有哪些_Java中的常量有哪些?

    java常量有哪些_Java中的常量有哪些?JAVA常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。那么java的常量有哪些呢?在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。下面我们就一起来看看java中的这些常量。1.整型常量整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制4种表示形式具体表示形式如下。二进制:由数字0和1组成的数字序列。在JDK7.0中允许使用字面值…

  • HTTPS实现及安全方面

    HTTPS实现及安全方面

  • 快排的优化方法(优化营商环境方案)

    聚集相同元素排序是快速排序的一种优化方案,它的思路是在经过一次找基准之后把数据中与基准相同的数据聚集到基准左右,这样就可以少进行几次递归找基准的过程,从而提高了运行效率。看以下程序:importjava.util.Arrays;publicclassFocusAlikeQuickSort{/**找基准的方法,与前文相同*/publicstatic…

  • lldp协议代码阅读_软件实现LLDP协议HaneWin LLDP Service[通俗易懂]

    lldp协议代码阅读_软件实现LLDP协议HaneWin LLDP Service[通俗易懂]这是软件实现LLDP协议HaneWinLLDPService,软件实现基于IEEE802.1AB标准的链路层发现协议LLDP代理。链路层发现协议(LLDP)是一种协议为物理拓扑发现在802Lan。相邻站发现并存储用于检索的LLDP代理由基于SNMP网络管理系统。软件介绍软件实现LLDP协议HaneWinLLDPService软件基础上的链路层发现协议符合IEEE…

  • Android startActivityForResult用法

    Android startActivityForResult用法一、介绍当我们在第一个Activity打开第二个Activity时,第二个Activity关闭并想返回数据给第一个Activity时,我们就可以使用startActivityForResult进行传值。用到的几个方法介绍:1.startActivityForResult(Intentintent,intrequestCode)requestCode:如果>=…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号