python 三种xml文件内容解析

需要解析的xml文件内容如下:

  <?xml version="1.0"?> 
<data> 
  <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> 

一,首先通过xml.etree进行解析

try: 
  import xml.etree.cElementTree as ET 
except ImportError: 
  import xml.etree.ElementTree as ET 
import sys 
  
try: 
  tree = ET.parse("country.xml")     #打开xml文档 
  #root = ET.fromstring(country_string) #从字符串传递xml 
  root = tree.getroot()         #获得root节点  
except Exception, e: 
  print "Error:cannot parse file:country.xml."
  sys.exit(1) 
print root.tag, "---", root.attrib  
for child in root: 
  print child.tag, "---", child.attrib 
  
print "*"*10
print root[0][1].text   #通过下标访问 
print root[0].tag, root[0].text 
print "*"*10
  
for country in root.findall('country'): #找到root节点下的所有country节点 
  rank = country.find('rank').text   #子节点下节点rank的值 
  name = country.get('name')      #子节点下属性name的值 
  print name, rank 
     
#修改xml文件 
for country in root.findall('country'): 
  rank = int(country.find('rank').text) 
  if rank > 50: 
    root.remove(country) 
  
tree.write('output.xml') 

#!/usr/bin/python 
#coding=utf-8 

二,使用xml.dom.进行内容解析  


from xml.dom.minidom import parse 
import xml.dom.minidom 
  
# 使用minidom解析器打开XML文档 
DOMTree = xml.dom.minidom.parse("country.xml") 
Data = DOMTree.documentElement 
if Data.hasAttribute("name"): 
  print "name element : %s" % Data.getAttribute("name") 
  
# 在集合中获取所有国家 
Countrys = Data.getElementsByTagName("country") 
  
# 打印每个国家的详细信息 
for Country in Countrys: 
  print "*****Country*****"
  if Country.hasAttribute("name"): 
   print "name: %s" % Country.getAttribute("name") 
  
  rank = Country.getElementsByTagName('rank')[0] 
  print "rank: %s" % rank.childNodes[0].data 
  year = Country.getElementsByTagName('year')[0] 
  print "year: %s" % year.childNodes[0].data 
  gdppc = Country.getElementsByTagName('gdppc')[0] 
  print "gdppc: %s" % gdppc.childNodes[0].data 
  
  for neighbor in Country.getElementsByTagName("neighbor"):  
    print neighbor.tagName, ":", neighbor.getAttribute("name"), neighbor.getAttribute("direction") 

 

三,使用xml.sax进行内容解析


import xml.sax 
  
class CountryHandler(xml.sax.ContentHandler): 
  def __init__(self): 
   self.CurrentData = "" 
   self.rank = "" 
   self.year = "" 
   self.gdppc = "" 
   self.neighborname = "" 
   self.neighbordirection = "" 
  
  # 元素开始事件处理 
  def startElement(self, tag, attributes): 
   self.CurrentData = tag 
   if tag == "country": 
     print "*****Country*****"
     name = attributes["name"] 
     print "name:", name 
   elif tag == "neighbor": 
     name = attributes["name"] 
     direction = attributes["direction"] 
     print name, "->", direction 
  
  # 元素结束事件处理 
  def endElement(self, tag): 
   if self.CurrentData == "rank": 
     print "rank:", self.rank 
   elif self.CurrentData == "year": 
     print "year:", self.year 
   elif self.CurrentData == "gdppc": 
     print "gdppc:", self.gdppc 
   self.CurrentData = "" 
  
  # 内容事件处理 
  def characters(self, content): 
   if self.CurrentData == "rank": 
     self.rank = content 
   elif self.CurrentData == "year": 
     self.year = content 
   elif self.CurrentData == "gdppc": 
     self.gdppc = content 
   
if __name__ == "__main__": 
   # 创建一个 XMLReader 
  parser = xml.sax.make_parser() 
  # turn off namepsaces 
  parser.setFeature(xml.sax.handler.feature_namespaces, 0) 
  
   # 重写 ContextHandler 
  Handler = CountryHandler() 
  parser.setContentHandler(Handler) 
    
  parser.parse("country.xml") 

从以上三种解析方式,个人更倾向流式的sax进行解析,相比较效率更高些。
 

转载于:https://my.oschina.net/210920/blog/748811

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值