Python解析XML文件详解:从基础概念到代码实战
本文系统讲解Python读取XML文件的方法,涵盖XML基础概念、结构特征及两种主流解析库的使用。通过xml.dom.minidom模块演示节点属性获取、子标签遍历及文本提取,并结合ElementTree模块介绍批量遍历技巧,帮助开发者掌握XML数据处理的实战技能。
Python XML解析概述
网络上关于Python处理XML的文章众多,但多数仅展示XML文件片段与处理代码,缺乏对初学者的友好引导。本文旨在通过通俗易懂的方式,详细解析如何使用Python读取和处理XML文件。
XML基础概念与特征
XML基础定义
XML全称为可扩展标记语言(eXtensible Markup Language),主要用于标记数据和定义数据类型。作为一种允许用户自定义标记语言的源语言,它提供了灵活的数据描述方式。
示例文件结构
<?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与常见的HTML(超文本标记语言)相似,但设计目的截然不同。HTML侧重于数据的外观展示,而XML专注于数据的传输与存储,其核心在于数据内容本身。
XML具备以下核心特征:
首先,XML由成对的标签组成,例如<aa></aa>。
其次,标签可以包含属性,如<aaid='123'></aa>的形式。
此外,标签对内部可以嵌入具体数据,例如<aa>abc</aa>。
最后,标签支持嵌套子标签,从而形成层级关系:
<aa>
<bb></bb>
</aa>
使用minidom获取节点属性
节点属性获取
接下来介绍如何使用Python读取此类XML文件。
#coding=utf-8
import xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
print root.nodeName
print root.nodeValue
print root.nodeType
print root.ELEMENT_NODE
处理XML文件主要依赖mxl.dom.minidom模块,因此首先需要导入该模块。
使用xml.dom.minidom.parse()函数可以打开指定的XML文件,并将解析后的文档对象赋值给dom变量。
通过documentElement属性获取dom对象的文档元素,并将该对象赋值给root变量以便后续操作。
XML中的每个节点都包含nodeName、nodeValue和nodeType三个关键属性。
nodeName表示节点的名字。
nodeValue表示节点的值,该属性仅对文本节点有效。
nodeType表示节点的类型,例如catalog节点通常属于ELEMENT_NODE类型。
常见的节点类型包括以下几种:
'ATTRIBUTE_NODE' 'CDATA_SECTION_NODE' 'COMMENT_NODE' 'DOCUMENT_FRAGMENT_NODE' 'DOCUMENT_NODE' 'DOCUMENT_TYPE_NODE' 'ELEMENT_NODE' 'ENTITY_NODE' 'ENTITY_REFERENCE_NODE' 'NOTATION_NODE' 'PROCESSING_INSTRUCTION_NODE' 'TEXT_NODE'
NodeTypes-有名常数
http://www.w3school.com.cn/xmldom/dom_nodetype.asp
子标签与同名标签处理
子标签获取方法
现在需要获取catalog子标签下的name标签内容。
<?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>
对于已知元素名称的子元素,可以使用getElementsByTagName方法进行获取:
<?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 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>
当存在多个<caption>和<item>标签时,如何进行区分?
#coding=utf-8
import xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
bb = root.getElementsByTagName('caption')
b= bb[2]
print b.nodeName
bb = root.getElementsByTagName('item')
b= bb[1]
print b.nodeName
调用root.getElementsByTagName('caption')会返回一组名为caption的标签集合,其中b[0]代表集合中的第一个标签,而b[2]代表第三个标签。
标签属性与内部数据提取
标签属性值提取
<?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>
<login>和<item>标签包含属性,如何获取这些属性的值?
#coding=utf-8
import xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
itemlist = root.getElementsByTagName('login')
item = itemlist[0]
un=item.getAttribute("username")
print un
pd=item.getAttribute("passwd")
print pd
ii = root.getElementsByTagName('item')
i1 = ii[0]
i=i1.getAttribute("id")
print i
i2 = ii[1]
i=i2.getAttribute("id")
print i
使用getAttribute方法可以获取元素对应属性的具体值。
标签对内部数据提取
<?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>
<caption>标签对之间包含具体数据,如何提取这些数据?
提取标签对之间的数据有多种方法:
方法一
#coding=utf-8
import xml.dom.minidom
#打开xml文档
dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象
root = dom.documentElement
cc=dom.getElementsByTagName('caption')
c1=cc[0]
print c1.firstChild.data
c2=cc[1]
print c2.firstChild.data
c3=cc[2]
print c3.firstChild.data
利用firstChild属性返回选中节点的第一个子节点,通过.data属性获取该节点的数据。
方法二
#coding=utf-8
from xml.etree import ElementTree as ET
per=ET.parse('abc.xml')
p=per.findall('./login/item')
for oneper in p:
for child in oneper.getchildren():
print child.tag,':',child.text
p=per.findall('./item')
for oneper in p:
for child in oneper.getchildren():
print child.tag,':',child.text
方法二相对复杂,引用的模块也与前文不同。findall函数用于指定从哪一级标签开始遍历。
getchildren方法按照文档顺序返回所有子标签,并输出标签名(child.tag)和标签数据(child.text)。
实际上,方法二的核心功能并非仅用于此,它主要用于遍历某一级标签下的所有子标签。
至此,关于Python读取XML文件的方法解析已完成,更多相关内容请搜索本站往期文章或继续浏览后续文章,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









