[关闭]
@qinian 2018-07-20T16:33:34.000000Z 字数 5704 阅读 1554

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)的规定,那么这个文档是模式有效的(schema> valid)。

三、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的效率更高一点而且使用起来很方便。
四、使用libxml2解析xml,libxml2是使用C语言开发的xml解析器,是一个基于MIT License的免费开源软件,多种编程语言都有基于它的实现。
五、使用lxml解析xmllxml是以上述介绍过的libxml2为基础采用python语言开发的,从使用层面上说比libxml2更适合python开发者


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. # XML文件读取
  4. dom = minidom.parse('info.xml')
  5. # 得到文档元素以及他的对象
  6. root = dom.documentElenment
  7. logins = root.getElementsByTagName('login')
  8. # 得到元素对象第一个logins标签的username属性值
  9. username = logins[0].getAttribute('username')
  10. print(username)
  11. # 得到元素对象第一个logins标签的password属性值
  12. username = logins[0].getAttribute('password')
  13. print(password)
  14. # 得到元素对象logins第二个标签的username属性值
  15. username = logins[1].getAttribute('username')
  16. print(username)
  17. # 得到元素对象logins第二个标签的password属性值
  18. username = logins[1].getAttribute('password')
  19. 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. # 解析xml文件
  3. root = ET.parse("info.xml")
  4. #获得根节点,查看根节点所有标签以及属性。
  5. root = tree.getroot()
  6. print('root.tag =', root.tag)
  7. print('root.attrib =', root.attrib)
  8. #遍历根节点可以获得子节点,遍历子节点可以获得孙子节点。
  9. for child in root: #仅可以解析出root的儿子,不能解析出root的子孙
  10. print(child.tag)
  11. print(child.attrib) # attrib is a dict
  12. #通过索引解析根的子孙
  13. print(root[1][2].tag)
  14. print(root[1][3].text)
  15. #迭代解析出所有的指定element,,返回字典
  16. for element in root.iter('test'):
  17. print(element.attrib)
  18. # element.findall()解析出指定test的所有儿子
  19. # element.find()解析出指定test的第一个儿子
  20. # element.get()解析出指定test的属性attrib
  21. for environment in root.findall('test'):
  22. first_variable = test.find('variable')
  23. print(first_variable.get('name'))
  24. #假设我们需要给每个text元素添加一个属性size="50",修改其text为"Benxin Tuzi",添加一个子元素date="2016/01/16"
  25. for text in root.iter('text'):
  26. text.set('size', '50')
  27. text.text = 'Benxin Tuzi'
  28. text.append(ET.Element('date', attrib={}, text='2016/01/16'))
  29. tree.write('output.xml')

2.2 lxml.etree
python lxml包用于解析XML和html文件,可以使用xpath和css定位元素。可参考:lxml手册,静觅博客Xpath

  1. from lxml import etree
  2. tree = etree.parse('info.xml') #构建xml树
  3. root = tree.getroot() #获得该树的树根
  4. for article in root:#这样便可以遍历根元素的所有子元素(这里是article元素)
  5. print "元素名称:",article.tag#用.tag得到该子元素的名称
  6. for field in article:#遍历article元素的所有子元素(这里是指articleauthortitlevolumeyear等)
  7. print field.tag,":",field.text#同样地,用.tag可以得到元素的名称,而.text可以得到元素的内容
  8. mdate=article.get("city")#用.get("属性名")可以得到元素相应属性的值
  9. print ("city:",city)
  10. '''结合xpath选取节点'''
  11. result = tree.xpath("//test")
  12. print result

参考:XML介绍/菜鸟教程
参考:Python XML解析
参考:Python实现XML文件解析/小兵千睿
参考:使用xml.etree.ElementTree模块来解析XML文件/benxintuzi
参考:python解析xml之lxml/编程浪子

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注