Document builder that uses Expat to build a ParsedXML.DOM document instance.
| 131 | |
| 132 | |
| 133 | class ExpatBuilder: |
| 134 | """Document builder that uses Expat to build a ParsedXML.DOM document |
| 135 | instance.""" |
| 136 | |
| 137 | def __init__(self, options=None): |
| 138 | if options is None: |
| 139 | options = xmlbuilder.Options() |
| 140 | self._options = options |
| 141 | if self._options.filter is not None: |
| 142 | self._filter = FilterVisibilityController(self._options.filter) |
| 143 | else: |
| 144 | self._filter = None |
| 145 | # This *really* doesn't do anything in this case, so |
| 146 | # override it with something fast & minimal. |
| 147 | self._finish_start_element = id |
| 148 | self._parser = None |
| 149 | self.reset() |
| 150 | |
| 151 | def createParser(self): |
| 152 | """Create a new parser object.""" |
| 153 | return expat.ParserCreate() |
| 154 | |
| 155 | def getParser(self): |
| 156 | """Return the parser object, creating a new one if needed.""" |
| 157 | if not self._parser: |
| 158 | self._parser = self.createParser() |
| 159 | self._intern_setdefault = self._parser.intern.setdefault |
| 160 | self._parser.buffer_text = True |
| 161 | self._parser.ordered_attributes = True |
| 162 | self._parser.specified_attributes = True |
| 163 | self.install(self._parser) |
| 164 | return self._parser |
| 165 | |
| 166 | def reset(self): |
| 167 | """Free all data structures used during DOM construction.""" |
| 168 | self.document = theDOMImplementation.createDocument( |
| 169 | EMPTY_NAMESPACE, None, None) |
| 170 | self.curNode = self.document |
| 171 | self._elem_info = self.document._elem_info |
| 172 | self._cdata = False |
| 173 | |
| 174 | def install(self, parser): |
| 175 | """Install the callbacks needed to build the DOM into the parser.""" |
| 176 | # This creates circular references! |
| 177 | parser.StartDoctypeDeclHandler = self.start_doctype_decl_handler |
| 178 | parser.StartElementHandler = self.first_element_handler |
| 179 | parser.EndElementHandler = self.end_element_handler |
| 180 | parser.ProcessingInstructionHandler = self.pi_handler |
| 181 | if self._options.entities: |
| 182 | parser.EntityDeclHandler = self.entity_decl_handler |
| 183 | parser.NotationDeclHandler = self.notation_decl_handler |
| 184 | if self._options.comments: |
| 185 | parser.CommentHandler = self.comment_handler |
| 186 | if self._options.cdata_sections: |
| 187 | parser.StartCdataSectionHandler = self.start_cdata_section_handler |
| 188 | parser.EndCdataSectionHandler = self.end_cdata_section_handler |
| 189 | parser.CharacterDataHandler = self.character_data_handler_cdata |
| 190 | else: |
no outgoing calls
no test coverage detected
searching dependent graphs…