Python解析XML文件详解:从基础概念到代码实战

今天早睡
今天早睡
发布时间:2026-10-15 | 4人浏览过
原创

本文系统讲解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文件的方法解析已完成,更多相关内容请搜索本站往期文章或继续浏览后续文章,感谢支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表