Advertisement
ijontichy

xmltest.py

May 14th, 2012
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.97 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. class XMLTag(object):
  4.    
  5.     def __init__(self, name, fields=None, data=None):
  6.         self.name = name
  7.         self.fields = fields or {}
  8.  
  9.         if isinstance(data, list):
  10.             self.data = data
  11.         else:
  12.             self.data = []
  13.  
  14.     def addData(self, newData):
  15.  
  16.         if (len(self.data) > 0) and (isinstance(self.data[-1], str)
  17.                                 and isinstance(newData, str)):
  18.             self.data[-1] = self.data[-1] + newData
  19.         else:
  20.             self.data.append(newData)
  21.  
  22.     def clearStrings(self):
  23.         ret = []
  24.         for i in self.data:
  25.             if not isinstance(i, str):
  26.                 ret.append(i)
  27.  
  28.         self.data = ret
  29.  
  30.     def find(self, tagName, which=0):
  31.         last       = None
  32.         foundCount = 0
  33.        
  34.         tagName = tagName.lower()
  35.  
  36.         for i in self.data:
  37.             if isinstance(i, XMLTag) and i.name.lower() == tagName:
  38.                 last = i
  39.                 if foundCount == which:
  40.                     return last
  41.  
  42.                 foundCount += 1
  43.  
  44.         return last
  45.  
  46.     def __repr__(self):
  47.         args = [self.name, self.fields, self.data]
  48.         return "{}({})".format(self.__class__.__name__, ", ".join(repr(i) for i in args))
  49.  
  50. class XMLCollector(object):
  51.    
  52.     def __init__(self):
  53.         self.level = 0
  54.         self.__data  = XMLTag("root")
  55.  
  56.     def startTag(self, name, fields):
  57.         currentLevel = self.__data
  58.        
  59.         for i in range(self.level):
  60.             currentLevel = currentLevel.data[-1]
  61.  
  62.         if not name.endswith("/"):
  63.             self.level += 1
  64.  
  65.         currentLevel.addData(XMLTag(name, fields))
  66.  
  67.     def tagData(self, data):
  68.         currentLevel = self.__data
  69.        
  70.         for i in range(self.level):
  71.             currentLevel = currentLevel.data[-1]
  72.  
  73.         currentLevel.addData(data)
  74.        
  75.        
  76.     def endTag(self, name):
  77.         self.level -= 1
  78.  
  79.     @property
  80.     def data(self):
  81.         return self.__data.data
  82.  
  83.     @property
  84.     def name(self):
  85.         return self.__data.name
  86.  
  87.     @property
  88.     def fields(self):
  89.         return self.__data.fields
  90.  
  91.  
  92. if __name__ == "__main__":
  93.     import pprint
  94.     from xml.parsers import expat
  95.  
  96.     xmlTags = XMLCollector()
  97.     xmlFile = open("format.xml", "rb")
  98.     eXMLParse = expat.ParserCreate()
  99.  
  100.     eXMLParse.StartElementHandler = xmlTags.startTag
  101.     eXMLParse.EndElementHandler = xmlTags.endTag
  102.     eXMLParse.CharacterDataHandler = xmlTags.tagData
  103.  
  104.     eXMLParse.ParseFile(xmlFile)
  105.  
  106.     for post in xmlTags.data:
  107.  
  108.         if isinstance(post, XMLTag) and post.name == "post":
  109.             print("- {} -".format(post.fields['topic']))
  110.             print("  Posted by: {} (id: {})".format(post.fields['author'], post.fields['id']))
  111.            
  112.             contents = post.find("contents")
  113.             if not contents:
  114.                 print("> [none]")
  115.                 continue
  116.  
  117.             contents = "".join(contents.data)
  118.             contents = "> " + contents.replace("\n", "> ")
  119.             print(contents)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement