XML文件解析

XML文件解析(原文)

python文件操作


网页基本知识,HTML和XML

一、HTML:

HTMLHyper Text Markup Language,指的是超文本标记语言(不是编程语言) 
超文本标记语言的结构包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。 
标记符:HTML,说明该文件是用超文本标记语言(本标签的中文全称)来描述的,超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据。为了说明文档使用的超文本标记语言标准,所有超文本标记语言文档应该以“文件类型声明”(外语全称加缩写<!DOCTYPE>)开头,引用一个文件类型描述或者必要情况下自定义一个文件类型描述。

二、XML

XMLExtentsibleMarkup 
Language(可扩展标记语言),是用来定义其它语言的一种元语言,其前身是SGML(标准通用标记语言)。它没有标签集(tagset),也没有语法规则(grammaticalrule),但是它有句法规则(syntax rule)。任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是模式有效的(schemavalid)。

三、HTML与XML的区别 
XMLHTML都是用于操作数据或数据结构,在结构上大致是相同的,但它们在本质上却存在着明显的区别。综合网上的各种资料总结如下。

(一)、语法要求不同:

  • HTML中不区分大小写,在XML中严格区分。

  • HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。

  • XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/字符作为结尾。这样分析器就知道不用查找结束标记了。

  • XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。

  • HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

  • XML文档中,空白部分不会被解析器自动删除;但是HTML是过滤掉空格的。

(二)、标记不同:

  • HTML使用固有的标记;而XML没有固有的标记。

  • HTML标签是预定义的;XML标签是免费的、自定义的、可扩展的。

(三)、作用不同:

  • HTML是用来显示数据的;XML是用来描述数据、存放数据的,所以可以作为持久化的介质。HTML将数据和显示结合在一起,在页面中把这数据显示出来;XML则将数据和显示分开。XML被设计用来描述数据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观。
  • XML不是HTML的替代品,XMLHTML是两种不同用途的语言。 XML不是要替换HTML;实际上XML可以视作对HTML 的补充。XMLHTML的目标不同HTML的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容。
  • 没有任何行为的XMLHTML相似,XML不进行任何操作。(共同点)
  • 对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具。
  • XML未来将会无所不在。XML将成为最普遍的数据处理和数据传输的工具。

四、XML文档树结构

XML文档必须包含根元素。该元素是所有其他元素的父元素。XML文档中的元素形成了一棵文档树,这棵树从根部开始,并扩展到树的最底端。所有的元素都可以有子元素:

 
  1. <bookstore>
  2. <book category="COOKING">
  3. <title lang="en">Everyday Italian</title>
  4. <author>Giada De Laurentiis</author>
  5. <year>2005</year>
  6. <price>30.00</price>
  7. </book>
  8. <book category="CHILDREN">
  9. <title lang="en">Harry Potter</title>
  10. <author>J K. Rowling</author>
  11. <year>2005</year>
  12. <price>29.99</price>
  13. </book>
  14. <book category="WEB">
  15. <title lang="en">Learning XML</title>
  16. <author>Erik T. Ray</author>
  17. <year>2003</year>
  18. <price>39.95</price>
  19. </book>
  20. </bookstore>

此处输入图片的描述

XML将数据组织成为一棵树,DOM 通过解析XML 文档,为 XML 文档在逻辑上建立一个树模型,树的节点是一个个的对象。这样通过操作这棵树和这些对象就可以完成对XML 文档的操作,为处理文档的所有方面提供了一个完美的概念性框架。

五、XML作用

  • XML与操作系统、编程语言的开发平台都无关
  • XML实现不同系统之间的数据交互
  • XMLAjax基石。(Ajax是现在目前比较流行的一个网络交互的技术。Ajax里面最后一个x实际上就是XML的缩写。)

六、XML文件格式

1、首先 info.xml 文件 

 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <info>
  3. <base>
  4. <platform>Windows</platform>
  5. <browser>Firefox</browser>
  6. <url>http://www.baidu.com</url>
  7. <login username="admin" passwd="123456"/>
  8. <login username="guest" passwd="123456"/>
  9. </base>
  10. <test>
  11. <province>北京</province>
  12. <province>广东</province>
  13. <city>深圳</city>
  14. <city>珠海</city>
  15. <province>浙江</province>
  16. <city>珠海</city>
  17. </test>
  18. </info>
  • tag,即标签,用于标识该元素表示哪种数据,即url login开头的那个。
  • attrib,即属性,用Dictionary形式保存,即username="admin"
  • text,文本字符串,可以用来存储一些数据,即hello123456789
  • tail,尾字符串,并不是必须的,例子中没有包含。

七、python对XML文件解析

1、XML文件解析 
解析思想: DOM解析和SAX解析,ET解析(元素树) 
一、是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOMAPI则该模块很适合; 
二、是xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存; 
三、是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ETET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。


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

 
  1. '''通过minidom解析xml文件'''
  2. import xml.dom as minidom
  3.  
  4. # XML文件读取
  5. dom = minidom.parse('info.xml')
  6.  
  7. # 得到文档元素以及他的对象
  8. root = dom.documentElenment
  9. logins = root.getElementsByTagName('login')
  10.  
  11. # 得到元素对象第一个logins标签的username属性值
  12. username = logins[0].getAttribute('username')
  13. print(username)
  14.  
  15. # 得到元素对象第一个logins标签的password属性值
  16. username = logins[0].getAttribute('password')
  17. print(password)
  18.  
  19. # 得到元素对象logins第二个标签的username属性值
  20. username = logins[1].getAttribute('username')
  21. print(username)
  22.  
  23. # 得到元素对象logins第二个标签的password属性值
  24. username = logins[1].getAttribute('password')
  25. print(password)

2.2 xml.etree.ElementTree 
ElementTree生来就是为了处理XML,它在Python标准库中有两种实现: 
一、纯Python实现的,如xml.etree.ElementTree, 
二、是速度快一点的xml.etree.cElementTree,从Python3.3开始ElementTree模块会自动寻找可用的C库来加快速度 。

 
  1. import xml.etree.ElementTree as ET
  2.  
  3. # 解析xml文件
  4. root = ET.parse("info.xml")
  5.  
  6. #获得根节点,查看根节点所有标签以及属性。
  7. root = tree.getroot()
  8. print('root.tag =', root.tag)
  9. print('root.attrib =', root.attrib)
  10.  
  11. #遍历根节点可以获得子节点,遍历子节点可以获得孙子节点。
  12. for child in root: #仅可以解析出root的儿子,不能解析出root的子孙
  13. print(child.tag)
  14. print(child.attrib) # attrib is a dict
  15.  
  16. #通过索引解析根的子孙
  17. print(root[1][2].tag)
  18. print(root[1][3].text)
  19.  
  20. #迭代解析出所有的指定element,,返回字典
  21. for element in root.iter('test'):
  22. print(element.attrib)
  23.  
  24. # element.findall()解析出指定test的所有儿子
  25. # element.find()解析出指定test的第一个儿子
  26. # element.get()解析出指定test的属性attrib
  27. for environment in root.findall('test'):
  28. first_variable = test.find('variable')
  29. print(first_variable.get('name'))
  30.  
  31. #假设我们需要给每个text元素添加一个属性size="50",修改其text为"Benxin Tuzi",添加一个子元素date="2016/01/16"
  32. for text in root.iter('text'):
  33. text.set('size', '50')
  34. text.text = 'Benxin Tuzi'
  35. text.append(ET.Element('date', attrib={}, text='2016/01/16'))
  36. tree.write('output.xml')

参考:XML介绍 
参考:Python XML解析 
参考:Python实现XML文件解析 
参考:使用xml.etree.ElementTree模块来解析XML文件

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值