Guest User

Untitled

a guest
May 24th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Much of this program is quoted from "Python Cookbook, 2nd Edition" p.479 (O'Reilly Japan).
  4. Only the method Element.__getattr__ is written by me.
  5. And changed to encode strings to UTF-8.
  6. """
  7.  
  8. from xml.parsers import expat
  9.  
  10. class Element(object):
  11.  
  12. def __init__(self, name, attributes):
  13. self.name = name
  14. self.attributes = attributes
  15. self.cdata = ''
  16. self.children = []
  17.  
  18. def __getattr__(self, key):
  19. return self.getElements(key)
  20.  
  21. def addChild(self, element):
  22. self.children.append(element)
  23.  
  24. def getAttribute(self, key):
  25. return self.attributes.get(key)
  26.  
  27. def getData(self):
  28. return self.cdata
  29.  
  30. def getElements(self, name=''):
  31. if name:
  32. return [child for child in self.children if child.name == name]
  33.  
  34. class Xml2Obj(object):
  35.  
  36. def __init__(self):
  37. self.root = None
  38. self.nodeStack = []
  39.  
  40. def StartElement(self, name, attributes):
  41. attributes = dict([(key, attributes[key].encode("utf-8")) for key in attributes])
  42. element = Element(name.encode("utf-8"), attributes)
  43. if self.nodeStack:
  44. parent = self.nodeStack[-1]
  45. parent.addChild(element)
  46. else:
  47. self.root = element
  48. self.nodeStack.append(element)
  49.  
  50. def EndElement(self, name):
  51. # self.nodeStack[-1].pop()
  52. # I think following is exact.
  53. self.nodeStack.pop()
  54.  
  55. def CharacterData(self, data):
  56. if data.strip():
  57. data = data.encode("utf-8")
  58. element = self.nodeStack[-1]
  59. element.cdata += data
  60.  
  61. def parse(self, string):
  62. Parser = expat.ParserCreate()
  63. Parser.StartElementHandler = self.StartElement
  64. Parser.EndElementHandler = self.EndElement
  65. Parser.CharacterDataHandler = self.CharacterData
  66. ParserStatus = Parser.Parse(string, True)
  67. return self.root
Add Comment
Please, Sign In to add comment