Python处理XML格式数据的方法详解

Python处理XML格式数据的方法详解

什么是XML

XML全称为eXtensible Markup Language,它主要用于描述数据。和HTML类似,XML也是一种标记语言,但XML不是用来显示数据,而是用来存储和传输数据。与HTML不同,XML没有预定义的标签,而是由用户根据需要定义标签。

Python模块处理XML

Python内置支持XML数据处理,包括DOM、SAX与ElementTree。

DOM解析器

DOM全称为Document Object Model,将整个XML文档转换为一棵树,操作XML文档的时候可以选择节点进行查找、删除、插入等操作,但是由于需要将整个XML文档转换为一个树形结构,会比较消耗内存。

以下是使用DOM解析器解析XML内容的代码示例:

import xml.dom.minidom

# 使用minidom解析器打开XML文档
DOMTree = xml.dom.minidom.parse("example.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print("Root element : %s" % collection.getAttribute("shelf"))

movies = collection.getElementsByTagName("movie")

for movie in movies:
   print("*****Movie*****")
   if movie.hasAttribute("title"):
      print("Title: %s" % movie.getAttribute("title"))

   type = movie.getElementsByTagName('type')[0]
   print("Type: %s" % type.childNodes[0].nodeValue)
   format = movie.getElementsByTagName('format')[0]
   print("Format: %s" % format.childNodes[0].nodeValue)
   rating = movie.getElementsByTagName('rating')[0]
   print("Rating: %s" % rating.childNodes[0].nodeValue)
   description = movie.getElementsByTagName('description')[0]
   print("Description: %s" % description.childNodes[0].nodeValue)

SAX解析器

SAX全称为Simple API for XML,不需要将整个XML文档读入内存来解析,只需要处理该文档的一部分即可,所以比较适合处理大型XML文件。

以下是使用SAX解析器处理XML内容的代码示例:

import xml.sax

class MovieHandler(xml.sax.ContentHandler):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # 元素开始事件处理
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print("*****Movie*****")
         title = attributes["title"]
         print("Title:", title)

   # 元素结束事件处理
   def endElement(self, tag):
      if self.CurrentData == "type":
         print("Type:", self.type)
      elif self.CurrentData == "format":
         print("Format:", self.format)
      elif self.CurrentData == "year":
         print("Year:", self.year)
      elif self.CurrentData == "rating":
         print("Rating:", self.rating)
      elif self.CurrentData == "stars":
         print("Stars:", self.stars)
      elif self.CurrentData == "description":
         print("Description:", self.description)
      self.CurrentData = ""

   # 内容事件处理
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content

# 创建一个XMLReader
parser = xml.sax.make_parser()
# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )

parser.parse("example.xml")

ElementTree

ElementTree是Python中最常用的处理XML文件的模块,它也在Python 2.5之后内置于Python中,使用它可以比较方便地处理XML文件。

以下是使用ElementTree处理XML文件的示例:

import xml.etree.ElementTree as ET

tree = ET.parse('example.xml')

root = tree.getroot()
print("Root tag:", root.tag)

for child in root:
    print(child.tag, child.attrib)

以上代码使用ElementTree解析XML文件,并打印出了根元素的标签名和子元素的标签名和属性。

示例

示例1

假设我们有一个XML文件,其中有多个book元素,每个book元素有title和author两个子元素,现在我们需要遍历XML文件,打印每个book元素的title和author。

XML文件内容:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
</catalog>

代码示例:

import xml.etree.ElementTree as ET

tree = ET.parse('example.xml')
root = tree.getroot()

for book in root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    print("Title: {}, Author: {}".format(title, author))

输出结果:

Title: XML Developer's Guide, Author: Gambardella, Matthew
Title: Midnight Rain, Author: Ralls, Kim
Title: Maeve Ascendant, Author: Corets, Eva

以上代码使用ElementTree遍历XML文档,使用findall方法找到所有book元素,使用find方法找到子元素titleauthor,最后打印出title和author。

示例2

假设我们有一个XML文件,其中有多个student元素,每个student元素有name、age、gender三个子元素,现在我们需要将每个student元素的内容写入到一个CSV文件中。

XML文件内容:

<?xml version="1.0"?>
<class>
   <student>
      <name>John</name>
      <gender>male</gender>
      <age>15</age>
   </student>
   <student>
      <name>Alice</name>
      <gender>female</gender>
      <age>16</age>
   </student>
   <student>
      <name>Mike</name>
      <gender>male</gender>
      <age>17</age>
   </student>
</class>

代码示例:

import csv
import xml.etree.ElementTree as ET

tree = ET.parse('example.xml')
root = tree.getroot()

# 打开CSV文件
with open('students.csv', 'w', newline='') as csvfile:
    # 创建CSV写入器
    writer = csv.writer(csvfile)
    writer.writerow(['Name', 'Age', 'Gender'])

    # 遍历XML文档
    for student in root.findall('student'):
        name = student.find('name').text
        age = student.find('age').text
        gender = student.find('gender').text
        writer.writerow([name, age, gender])

以上代码使用了CSV模块,先打开一个CSV文件,然后遍历XML文档,将每个student元素的内容写入到CSV文件中。最后关闭CSV文件。

CSV文件的内容如下:

Name,Age,Gender
John,15,male
Alice,16,female
Mike,17,male

总结

本文介绍了Python处理XML格式数据的方法,包括DOM、SAX和ElementTree三种方式,并提供了相应的代码示例。掌握这些方法可以帮助我们更方便地对XML文件进行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python处理XML格式数据的方法详解 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 实例解析Android中使用Pull解析器解析XML的方法

    实例解析Android中使用Pull解析器解析XML的方法 本篇攻略将为您介绍在Android应用中基于Pull解析器解析XML文件的方法。 Pull解析器是一种基于事件的XML解析方式,它的解析效率较高,且占用内存比DOM解析器更低。跟随下文,您将学习到Pull解析器的实例和使用方式。 准备工作 在你开始引入Pull解析器之前,需要确保已经在Android…

    html 2023年5月30日
    00
  • ios7.1.2怎么升级?苹果ios7.1.2更新升级方法步骤及注意事项详细介绍

    以下是“ios7.1.2怎么升级?苹果ios7.1.2更新升级方法步骤及注意事项详细介绍”的完整攻略: ios7.1.2怎么升级?苹果ios7.1.2更新升级方法步骤及注意事项详细介绍 iOS 7.1.2是苹果公司发布的一款操作系统版本。以下是对其的升级攻略: 备份数据:在升级之前,您需要备份您的设备数据。您可以使用iCloud或iTunes进行备份。 检查…

    html 2023年5月18日
    00
  • 利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位

    获取地理位置和在 Google Map 上进行定位,是 Web 开发中一个常见的需求。本文将介绍如何利用 HTML5 中的 Geolocation API 获取地理位置,然后调用 Google Map API 在地图上进行定位。 获取地理位置 HTML5 中内置了 Geolocation API,可以通过 JavaScript 代码来获取当前设备的地理位置。…

    html 2023年5月30日
    00
  • javascript解析xml字符串的函数

    这里介绍两种JavaScript解析XML字符串的函数: 使用DOMParser 步骤: 创建一个XML字符串变量 建立一个DOMParser对象 将XML字符串传递给DOMParser对象的parseFromString方法 执行XPath选择器 示例代码: const xmlString = `<bookstore> <book cat…

    html 2023年5月30日
    00
  • cad文件中怎么画表格?cad表格的使用方法

    手机误删除照片如何恢复?使用Recuva恢复手机内误删除照片教程 当您误删除手机内的照片时,您可以使用Recuva等数据恢复软件来恢复这些照片。以下是关于如何使用Recuva恢复手机内误删除照片的攻略,包括以下几个步骤: 步骤1:下载并安装Recuva 在使用Recuva恢复手机内误删除照片之前,您需要下载并安装Recuva。以下是下载并安装Recuva的步…

    html 2023年5月17日
    00
  • Java Bean与xml互相转换的方法分析

    Java Bean与XML互相转换的方法分析 在Java开发中,Java Bean常常被用作数据封装的载体,而XML则成为了数据传输的重要格式之一。当我们需要将Java Bean中的数据导出成XML格式或者将XML数据转换成Java Bean对象时,就需要使用Java Bean与XML互相转换的方法。本文将介绍Java Bean与XML互相转换的三种常见方式…

    html 2023年5月30日
    00
  • flash怎么制作上标和下标?

    以下是“flash怎么制作上标和下标?”的完整攻略: Flash怎么制作上标和下标? 在Flash中,制作上标和下标可以通过使用文本工具和特殊字符来实现。以下是制作上标和下标的步骤: 步骤1:打开Flash软件 首先,打开Flash软件,创建一个新的文档。 步骤2:添加文本 在Flash文档中,使用文本工具添加需要制作上标或下标的文本。 步骤3:制作上标 要…

    html 2023年5月18日
    00
  • springboot使用Mybatis(xml和注解)过程全解析

    以下是对”springboot使用Mybatis(xml和注解)过程全解析”的详细讲解: 一、前言 Mybatis是一款优秀的基于Java的持久化框架,它拥有非常高灵活性,除了能够适配各种传统的数据库,还能够适应各种数据源甚至于比较小众的数据存储方式。而SpringBoot则是近些年最火热的Web框架之一,它的主打特点在于快速集成,可以让Java项目开发人员…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部