VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:xml.etree.ElementTree XML操纵API(3)

','start-ns','end-ns']
  • for (event,node) in iterparse('podcasts.opml',EVENT_NAMES):
  • if event == 'end':
  • depth -= 1
  •  
  • prefix_len = depth * 2
  •  
  • print(line_template.format(
  • prefix = prefix_dots,
  • prefix_len = prefix_len,
  • suffix = '',
  • suffix_len = (prefix_width - prefix_len),
  • node = node,
  • node_id = id(node),
  • event = event,
  • ))
  •  
  • if event == 'start':
  • depth += 1
  • 默认的,只会生成end事件。要查看其他事件,可以将所需的事件名列表传入iterparse()。

    以事件方式进行处理对于某些操作来说更为自然,如将XML输入转换为另外某种格式。可以使用这个技术将播可列表(来自前面的例子)从XML文件转换为一个CSV文件,以便把它们加载到一个电子表格或数据库应用。

    
    	
    1. import csv
    2. import sys
    3. from xml.etree.ElementTree import iterparse
    4.  
    5. writer = csv.writer(sys.stdout,quoting=csv.QUOTE_NONNUMERIC)
    6. group_name = ''
    7.  
    8. parsing = iterparse('podcasts.opml',events=['start'])
    9.  
    10. for (event,node) in parsing:
    11. if node.tag != 'outline':
    12. # Ignore anything not part of the outline.
    13. continue
    14. if not node.attrib.get('xmlUrl'):
    15. #Remember the current group.
    16. group_name = node.attrib['text']
    17. else:
    18. #Output a podcast entry.
    19. writer.writerow(
    20. (group_name,node.attrib['text'],
    21. node.attrib['xmlUrl'],
    22. node.attrib.get('htmlUrl',''))
    23. )

    这个转换程序并不需要将整个已解析的输入文件保存在内存中,其在遇到输入中的各个节点时才进行处理,这样做会更为高效。

    1.6 创建一个定制树构造器

    要处理解析事件,一种可能更高效的方法是将标准的树构造器行为替换为一种定制行为。XMLParser解析器使用一个TreeBuilder处理XML,并调用目标类的方法保存结果。通常输出是由默认TreeBuilder类创建的一个ElementTree实例。可以将TreeBuilder替换为另一个类,使它在实例化Element节点之前接收事件,从而节省这部分开销。 

    可以将XML-CSV转换器重新实现为一个树构造器。

    
    	
    1. import io
    2. import csv
    3. import sys
    4. from xml.etree.ElementTree import XMLParser
    5.  
    6. class PodcastListToCSV(object):
    7. def __init__(self,outputFile):
    8. self.writer = csv.writer(
    9. outputFile,
    10. quoting = csv.QUOTE_NONNUMERIC,
    11. )
    12. self.group_name = ''
    13.  
    14. def start(self,tag,attrib):
    15. if tag != 'outline':
    16. # Ignore anything not part of the outline.
    17. return
    18. if not attrib.get('xmlUrl'):
    19. #Remember the current group.
    20. self.group_name = attrib['text']
    21. else:
    22. #Output a pddcast entry.
    23. self.writer.writerow(
    24. (self.group_name,
    25. attrib['text'],
    26. attrib['xmlUrl'],
    27. attrib.get('htmlUrl',''))
    28. )
    29. def end(self,tag):
    30. "Ignore closing tags"
    31. def data(self,data):
    32. "Ignore data inside nodes"
    33. def close(self):
    34. "Nothing special to do here"
    35.  
    36. target = PodcastListToCSV(sys.stdout)
    37. parser
    
    相关教程