当前位置: 首页 > 工具软件 > Python OWL > 使用案例 >

python ——XML操作

贝德辉
2023-12-01


活动地址:CSDN21天学习挑战赛

一,什么是xml

XML 被设计用来传输和存储数据。可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

1.1 XML 用途

XML 应用于 Web 开发的许多方面,常用于简化数据的存储和共享。


XML 把数据从 HTML 分离

如果您需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。

通过 XML,数据能够存储在独立的 XML 文件中。这样您就可以专注于使用 HTML/CSS 进行显示和布局,并确保修改底层数据不再需要对 HTML 进行任何的改变。

通过使用几行 JavaScript 代码,您就可以读取一个外部 XML 文件,并更新您的网页的数据内容。


XML 简化数据共享

在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。

XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。

这让创建不同应用程序可以共享的数据变得更加容易。


XML 简化数据传输

对开发人员来说,其中一项最费时的挑战一直是在互联网上的不兼容系统之间交换数据。

由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。


XML 简化平台变更

升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。

XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新的应用程序或新的浏览器。


XML 使您的数据更有用

不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。

通过 XML,您的数据可供各种阅读设备使用(掌上计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。


XML 用于创建新的互联网语言

很多新的互联网语言是通过 XML 创建的。

这里有一些实例:

  • XHTML
  • 用于描述可用的 Web 服务 的 WSDL
  • 作为手持设备的标记语言的 WAP 和 WML
  • 用于新闻 feed 的 RSS 语言
  • 描述资本和本体的 RDF 和 OWL
  • 用于描述针针对 Web 的多媒体 的 SMIL

二,python解析xml

2.1 python解析xml的三种方式

Python 有三种 XML 解析方式:SAX(simple API for XML)、DOM(Document Object Model)、ElementTree。

DOM 方式:DOM 中文译为文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。

SAX 方式:SAX 是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析,对于大型文档的解析拥有巨大优势,尽管不是 W3C 标准,但它却得到了广泛认可。

ElementTree 方式:ElementTree 相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。

2.2,解析xml

1.DOM 方式

以下是需要解析的xml文件内容

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
  <PicUrl><![CDATA[this is a url]]></PicUrl>
  <MediaId><![CDATA[media_id]]></MediaId>
  <MsgId>1234567890123456</MsgId>
   <MsgDataId>啊啊啊</MsgDataId>
  <Idx>8520963.</Idx>
</xml>

实现代码:

# 创建者   :阿乐
# 创建事件 :2022/8/8 16:15

import xml.dom.minidom
# 读取文件
dom = xml.dom.minidom.parse('a.xml')
print(dom)
# 获取文档元素对象
data = dom.documentElement
print(data.nodeValue)
# 获取 student
stus = dom.getElementsByTagName('student')
print(len(stus))
for stu in stus:
	# 获取标签中内容
    print(stu)
    ToUserName = stu.getElementsByTagName('ToUserName')[0].childNodes[0].nodeValue
    FromUserName = stu.getElementsByTagName('FromUserName')[0].childNodes[0].nodeValue
    CreateTime = stu.getElementsByTagName('CreateTime')[0].childNodes[0].nodeValue
    MsgType = stu.getElementsByTagName('MsgType')[0].childNodes[0].nodeValue
    PicUrl = stu.getElementsByTagName('PicUrl')[0].childNodes[0].nodeValue
    MediaId = stu.getElementsByTagName('MediaId')[0].childNodes[0].nodeValue
    MsgId = stu.getElementsByTagName('MsgId')[0].childNodes[0].nodeValue
    MsgDataId = stu.getElementsByTagName('MsgDataId')[0].childNodes[0].nodeValue
    Idx = stu.getElementsByTagName('Idx')[0].childNodes[0].nodeValue
    print('ToUserName:', ToUserName, ', FromUserName:', FromUserName, ', CreateTime:', CreateTime, ', MsgType:',MsgType,'PicUrl:', PicUrl, ', MediaId:', MediaId, ', MsgId:', MsgId, ', MsgDataId:',MsgDataId, ', Idx:',Idx)

 运行结果:

<xml.dom.minidom.Document object at 0x000001F4323245E0>
None
1
<DOM Element: student at 0x1f431ac3e20>
ToUserName: toUser , FromUserName: fromUser , CreateTime: 1348831860 , MsgType: image PicUrl: this is a url , MediaId: media_id , MsgId: 1234567890123456 , MsgDataId: 啊啊啊 , Idx: 8520963.

进程已结束,退出代码0

2.SAX 方式  

 需要解析的xml文件内容

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

 实现代码:

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
  
if ( __name__ == "__main__"):
   
   # 创建一个 XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)
 
   # 重写 ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")

运行结果:

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

3.ElementTree 方式  

 需要解析的xml文件内容

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

 实现代码: 

import xml.etree.ElementTree as ET

# 读取、解析文件,获取跟元素
tree = ET.parse('a.xml')
root = tree.getroot()

# 获取根元素的标签名称以及所有属性
# data
print(root.tag)
# country {'name': 'Liechtenstein'}
# country {'name': 'Singapore'}
# country {'name': 'Panama'}
print(root.attrib)

# 获取text
# 2008
print(root[0][1].text)

# 遍历名为 neighbor 的所有元素,并输出其对应的属性值
# {'name': 'Austria', 'direction': 'E'}
# {'name': 'Switzerland', 'direction': 'W'}
# {'name': 'Malaysia', 'direction': 'N'}
# {'name': 'Costa Rica', 'direction': 'W'}
# {'name': 'Colombia', 'direction': 'E'}
for neighbor in root.iter('neighbor'):
    print(neighbor.attrib)

# 一次性获取所有名为 country 的元素、然后遍历
# 寻找名为 rank 的子节点,获取其text
# 获取 country 元素中的 name 属性
# Liechtenstein 1
# Singapore 4
# Panama 68
for country in root.findall('country'):
    rank = country.find('rank').text
    name = country.get('name')
    print(name, rank)

运行结果: 

data
{}
2008
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}
Liechtenstein 1
Singapore 4
Panama 68

进程已结束,退出代码0
 类似资料: