15. XML解析

阅读: 评论:0

15. XML解析

15. XML解析

1. 什么是 XML?

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

2. XML 和 HTML 之间的差异

XML 不是 HTML 的替代
a. XML 和 HTML 为不同的目的而设计:
b. XML 被设计用来传输和存储数据,其焦点是数据的内容。
c. HTML 被设计用来显示数据,其焦点是数据的外观。
d. HTML 旨在显示信息,而 XML 旨在传输信息。

3. 通过 XML 可以自定义标签

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

上面实例中的标签没有在任何 XML 标准中定义过(比如 <to><from>)。这些标签是由 XML 文档的创作者发明的
这是因为 XML 语言没有预定义的标签。HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p><h1> 等等)。XML 允许创作者定义自己的标签和自己的文档结构

4. python中对XML的解析

XML比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。
python有三种方法解析XML,SAXDOM,以及 ElementTree
本篇中使用到的XML实例文件如下:

# l
<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>

5. 使用 SAX方式 解析 xml

SAX 是一种基于事件驱动的API。
利用 SAX 解析 XML 文档牵涉到两个部分: 解析器事件处理器
解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
事件处理器负责对事件作出响应,对传递的 XML 数据进行处理
 (1) 对大型文件进行处理;
 (2) 只需要文件的部分内容,或者只需从文件中得到特定信息;
 (3) 想建立自己的对象模型的时候。
在 python 中使用 SAX 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler

import xml.saxclass MovieHandler(xml.sax.ContentHandler):def __init__(self):self.CurrentData = "&#pe = ""self.format = "&#ar = ""self.rating = ""self.stars = ""self.description = ""# 元素开始调用 => 遇到XML开始标签时调用, tag是标签的名字, attributes是标签的属性字典值def startElement(self, tag, attributes):self.CurrentData = tagif tag == "movie":print('')print("Title:", attributes["title"])# 元素结束调用 => 遇到XML结束标签时调用def endElement(self, tag):if self.CurrentData == "type":print("Type:", pe)elif self.CurrentData == "format":print("Format:", self.format)elif self.CurrentData == "year":print("Year:", ar)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":pe = contentelif self.CurrentData == "format":self.format = contentelif self.CurrentData == "year":ar = contentelif self.CurrentData == "rating":self.rating = contentelif self.CurrentData == "stars":self.stars = contentelif self.CurrentData == "description":self.description = contentif __name__ == "__main__":# 创建一个 XMLReaderparser = xml.sax.make_parser()# 关闭命名空间parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重写 ContextHandlerparser.setContentHandler(MovieHandler())# 解析xml文档parser.parse(&#l")

6. 使用 DOM方式 解析 xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。
在 python 中使用 DOM 方式处理 xml 则要通过 xml.dom.minidom 来解析 xml 文件。

import xml.dom.minidomif __name__ == "__main__":# 使用minidom解析器打开XML文档DOMTree = xml.dom.minidom.parse(&#l")collection = DOMTree.documentElementif collection.hasAttribute("shelf"):print("Root element : %s" % Attribute("shelf"))# 在集合中获取所有电影(整个movie节点项)movies = ElementsByTagName("movie")# 打印每部电影的详细信息for movie in movies:print('')if movie.hasAttribute("title"):print("Title: %s" % Attribute("title"))type = ElementsByTagName('type')[0]print("Type: %s" % type.childNodes[0].data)format = ElementsByTagName('format')[0]print("Format: %s" % format.childNodes[0].data)rating = ElementsByTagName('rating')[0]print("Rating: %s" % rating.childNodes[0].data)description = ElementsByTagName('description')[0]print("Description: %s" % description.childNodes[0].data)

7. 使用 ElementTree方式 解析xml

与DOM相比,ET的速度更快,API使用更直接、方便。与SAX相比,ET.iterparse函数同样提供了按需解析的功能,不会一次性在内存中读入整个文档ET的性能与SAX模块大致相仿,但是它的API更加高层次,用户使用起来更加便捷

Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。
[注意] ElementTree模块在应对恶意结构数据时显得并不安全。
每个element对象都具有以下属性:1. tag:string对象,表示数据代表的种类。2. attrib:dictionary对象,表示附有的属性。3. text:string对象,表示element的内容。4. tail:string对象,表示element闭合之后的尾迹。
<tag attrib1=1>text</tag>tail1     2        3         4
ElementTree as ETtree = ET.parse(&#l')
root = t()
# print(root.tag, ',', root.attrib)  # 打印根元素标签及属性# child就是movie结点
# children是moive结点的项item
for Node in root.findall("movie"):print('')for item in Node:print(item.tag, ':', )

8. 写在最后

更多详细API及demo请参考官网网站:
.9/library/markup.html#structured-markup-processing-tools

本文发布于:2024-01-28 14:04:41,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064218887945.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:XML
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23