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日

相关文章

  • 详解PHP原生DOM对象操作XML的方法

    下面是“详解PHP原生DOM对象操作XML的方法”的完整攻略: 1. 简介 PHP原生DOM (Document Object Model)是一种基于树结构的API,用于处理XML文档的各种操作,如创建、读取、修改和删除XML节点。本篇攻略将详细介绍使用PHP原生DOM对象操作XML文档的方法。 2. 读取XML文档 首先,我们需要将XML文档加载到DOM对…

    html 2023年5月30日
    00
  • Android实现可点击的幸运大转盘

    下面是详细的攻略。 1. 背景 幸运大转盘是一种常见的抽奖形式,用户可以通过旋转转盘来获得奖品或优惠。本文讲解如何在Android应用中实现可点击的幸运大转盘。 2. 实现过程 2.1 准备工作 在开始实现之前,需要准备以下工作: 在布局文件中添加一个ImageView用于显示转盘; 准备好转盘的图片资源。 2.2 实现点击事件 为了实现可点击的转盘,需要在…

    html 2023年5月31日
    00
  • SpringBoot整合WebSocket实现后端向前端发送消息的实例代码

    下面是“SpringBoot整合WebSocket实现后端向前端发送消息的实例代码”的完整攻略: 1. 引入相关依赖 首先,我们需要在SpringBoot的项目中引入以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g…

    html 2023年5月31日
    00
  • idea中使用Inputstream流导致中文乱码解决方法

    当我们在使用Java的InputStream流读取文件时,如果文件中含有中文字符,有时候会出现中文字符乱码的问题。其中一个常见的情况是使用idea开发工具进行开发时,读取中文文件内容会出现乱码。这里介绍两种解决方法。 方法一:使用BufferedReader进行流读取 BufferedReader是 java.io 包中一个读取字符流的处理类,使用该类可以避…

    html 2023年5月31日
    00
  • C#对象与XMl文件之间的相互转换

    下面我为您提供“C#对象与XML文件之间的相互转换”的完整攻略。 1. 将C#对象转换为XML文件 我们可以通过使用C#中的XML序列化来将C#对象转换成XML文件。具体来说,以下是该过程的主要步骤: 1.1 定义需要序列化的类 在将对象转换为XML文件之前,您需要在C#中定义需要进行序列化的类。例如,我们定义一个名为“Person”的类,代码如下所示: […

    html 2023年5月31日
    00
  • 深入解析XML中的字符实体与字符数据

    深入解析XML中的字符实体与字符数据 什么是XML XML全称可扩展标记语言,它是一种用来描述和存储数据的标记语言,通常用于网络上传输数据,同时也可以用于本地数据交换。XML格式的数据具有自我描述性和平台无关性,易于解析和处理。 什么是字符实体 在XML中,有些字符具有特殊的意义,比如小于号(<)和大于号(>),如果直接在XML中使用这些字符,那…

    html 2023年5月30日
    00
  • C++读入XML文件示例

    我来为您详细讲解一下 “C++读入XML文件示例” 的完整攻略。 什么是XML文件? XML 是一种用于创建其他标记语言的语言,可以用来编写具有良好可读性的文件。它通过标记来表示数据的结构和内容,标记可以自己定义。XML 文件可以使用各种不同的应用程序进行读取、解析、编辑和生成。 C++如何读取和解析XML文件? C++ 读取和解析 XML 文件通常使用第三…

    html 2023年5月30日
    00
  • 获取Android手机中所有短信的实现代码

    获取Android手机中所有短信的实现代码需要借助Android的Content Provider机制。以下是具体的实现步骤: 步骤一:声明读取短信的权限 在AndroidManifest.xml中声明读取短信的权限: <uses-permission android:name="android.permission.READ_SMS&quo…

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