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日

相关文章

  • Unity利用XML制作一个简易的登录系统

    当我们在游戏或应用的开发过程中,需要进行用户登录和账户管理时,一个常见的选择是使用XML作为登录系统的存储方式。本篇攻略将介绍如何使用Unity和C#编写一个简易的登录系统,包含以下步骤: 创建XML文件 读取XML文件 写入XML文件 验证用户信息 创建XML文件 首先,我们需要在Unity项目中创建一个新的XML文件来存储用户信息。可以使用任何文本编辑器…

    html 2023年5月30日
    00
  • 小红书怎么样才能有收益

    以下是“小红书怎么样才能有收益”的完整攻略: 小红书怎么样才能有收益 小红书是一款社交电商平台,用户可以在平台上分享自己的购物心得和体验,并通过推广商品获得收益。下面是小红书怎么样才能有收益的攻略。 成为小红书达人 成为小红书达人是获得收益的前提条件之一。小红书达人是指在小红书上有一定影响力的用户,他们的分享和推荐可以影响其他用户的购买决策。成为小红书达人需…

    html 2023年5月18日
    00
  • HTML5的表单(绝对特别强大的功能)使用示例

    下面我来详细讲解“HTML5的表单(绝对特别强大的功能)使用示例”的完整攻略。 HTML5表单概述 HTML5新增了很多表单元素和属性,提供了更加强大和灵活的表单功能,包括但不限于以下几点: 新增了一些表单元素,如date、time、email、tel等,这些表单元素让用户选择更具有语义和响应性的数据。 改进了表单验证功能,新的属性和API能够让开发者更加方…

    html 2023年5月30日
    00
  • Spring表达式语言SpEL用法详解

    Spring表达式语言SpEL用法详解 什么是SpEL SpEL是Spring表达式语言,它提供了一种表达式语言,可以在运行时计算表达式的值。SpEL可以用于访问JavaBean属性,调用Java方法,在运行时计算数学表达式等。 SpEL语法 SpEL语法非常灵活,可以完成各种复杂的计算。 变量表达式 变量表达式允许我们使用变量或者Spring的bean,变…

    html 2023年5月30日
    00
  • Python中使用dom模块生成XML文件示例

    生成 XML 文件在 Python 中是一项非常常见的任务。使用 Python 的 dom 模块可以轻松地构建 XML 文档。制作 XML 文档通常涉及以下步骤: 创建 XML 文档对象 创建元素节点,并将它们添加到文档中 将文档写入文件或打印到控制台 下面我们来看看如何使用 Python dom 模块创建 XML 文件。 创建 XML 文件对象 要使用 d…

    html 2023年5月30日
    00
  • 请求转发jsp页面乱码问题的快速解决方法

    针对 “请求转发jsp页面乱码问题的快速解决方法”,我为你提供以下完整攻略: 问题描述 在JSP开发中,有时使用请求转发(forward)时,目标JSP页面出现了乱码的问题,造成页面无法正常显示。 解决方法 1. 统一编码格式 在JSP页面中添加以下代码,来设置页面的编码格式为UTF-8。 <%@ page language="java&qu…

    html 2023年5月31日
    00
  • java中xml进行报文发送和解析操作

    实现Java中XML进行报文发送和解析操作的详细攻略如下: 1. XML报文发送操作 在Java中,可以利用DOM、SAX等方式创建XML文档。以DOM方式为例,我们可以使用以下步骤进行XML报文发送操作: 创建DocumentBuilderFactory对象,并通过其的newDocumentBuilder()方法获取一个DocumentBuilder对象。…

    html 2023年5月30日
    00
  • PHP PDOStatement::getColumnMeta讲解

    PHP PDOStatement::getColumnMeta讲解 1. 什么是PDOStatement::getColumnMeta()? PDOStatement::getColumnMeta() 是 PHP PDO 扩展提供的一个函数,可以用来获取 PDOStatement 对象中的某个列的基本信息(如数据类型、长度等)。 2. 如何使用 PDOSta…

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