sax.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from __future__ import absolute_import, division, unicode_literals
  2. from xml.sax.xmlreader import AttributesNSImpl
  3. from ..constants import adjustForeignAttributes, unadjustForeignAttributes
  4. prefix_mapping = {}
  5. for prefix, localName, namespace in adjustForeignAttributes.values():
  6. if prefix is not None:
  7. prefix_mapping[prefix] = namespace
  8. def to_sax(walker, handler):
  9. """Call SAX-like content handler based on treewalker walker"""
  10. handler.startDocument()
  11. for prefix, namespace in prefix_mapping.items():
  12. handler.startPrefixMapping(prefix, namespace)
  13. for token in walker:
  14. type = token["type"]
  15. if type == "Doctype":
  16. continue
  17. elif type in ("StartTag", "EmptyTag"):
  18. attrs = AttributesNSImpl(token["data"],
  19. unadjustForeignAttributes)
  20. handler.startElementNS((token["namespace"], token["name"]),
  21. token["name"],
  22. attrs)
  23. if type == "EmptyTag":
  24. handler.endElementNS((token["namespace"], token["name"]),
  25. token["name"])
  26. elif type == "EndTag":
  27. handler.endElementNS((token["namespace"], token["name"]),
  28. token["name"])
  29. elif type in ("Characters", "SpaceCharacters"):
  30. handler.characters(token["data"])
  31. elif type == "Comment":
  32. pass
  33. else:
  34. assert False, "Unknown token type"
  35. for prefix, namespace in prefix_mapping.items():
  36. handler.endPrefixMapping(prefix)
  37. handler.endDocument()