a a$@sdZddlmZddlmZddlmZddlmZm Z ddlm Z m Z Gdddej Z d d ZGd d d eZGd ddeZddZdS)a? SAX-based adapter to copy trees from/to the Python standard library. Use the `ElementTreeContentHandler` class to build an ElementTree from SAX events. Use the `ElementTreeProducer` class or the `saxify()` function to fire the SAX events of an ElementTree against a SAX ContentHandler. See https://lxml.de/sax.html )absolute_import)ContentHandler)etree) ElementTree SubElement)CommentProcessingInstructionc@seZdZdZdS)SaxErrorzGeneral SAX error. N)__name__ __module__ __qualname____doc__rr./usr/lib64/python3.9/site-packages/lxml/sax.pyr sr cCs0|ddkr$t|ddddSd|fSdS)Nr{})tuplesplit)tagrrr _getNsTags rc@seZdZdZd ddZddZeeejdZdd Zd d Z d d Z ddZ ddZ ddZ d!ddZddZddZd"ddZddZddZeZdS)#ElementTreeContentHandlerz/Build an lxml ElementTree from SAX events. NcCsLt|d|_g|_g|_d|_ddgi|_i|_|durBtj }||_ dSN) r__init___root_root_siblings_element_stack _default_ns _ns_mapping _new_mappingsrZElement _makeelement)selfZ makeelementrrrr&s  z"ElementTreeContentHandler.__init__cCs t|jS)z=Contains the generated ElementTree after parsing is finished.)rrr!rrr _get_etree2sz$ElementTreeContentHandler._get_etree)doccCsdSrr)r!ZlocatorrrrsetDocumentLocator8sz,ElementTreeContentHandler.setDocumentLocatorcCsdSrrr"rrr startDocument;sz'ElementTreeContentHandler.startDocumentcCsdSrrr"rrr endDocument>sz%ElementTreeContentHandler.endDocumentcCsP||j|<z|j||Wnty<|g|j|<Yn0|durL||_dSr)rrappendKeyErrorr)r!prefixurirrrstartPrefixMappingAs  z,ElementTreeContentHandler.startPrefixMappingcCs(|j|}||dur$|d|_dSN)rpopr)r!r*Z ns_uri_listrrrendPrefixMappingJs z*ElementTreeContentHandler.endPrefixMappingcCs4|\}}|rd|}n|jr,d|j|f}n|}|S)N{%s}%s)r)r!Z ns_name_tuplens_uri local_nameel_tagrrr _buildTagPs z#ElementTreeContentHandler._buildTagc Cs||}|rli}z |}Wnty8|}Yn0|D]*\}}|drXd|} n|d} ||| <q>nd}|j} |jdur||||j} |_|jrt | dr|jD]} | | q|jdd=nt | d|||j} | | |j dS)Nrr1r addpreviousr.)r5Z iteritemsAttributeErroritemsrrr rrhasattrr6rr(clear) r!ns_nameqname attributesZel_nameattrsZiter_attributesZ name_tuplevalueZ attr_nameZ element_stackelementsiblingrrrstartElementNSZs4           z(ElementTreeContentHandler.startElementNScCs6t||}|jdur"|j|n|jd|dSr-)rrrr(r)r!targetdataZpirrrprocessingInstruction{s  z/ElementTreeContentHandler.processingInstructioncCs.|j}||}||jkr*td|dS)NzUnexpected element closed: )rr/r5rr )r!r;r<r@r4rrr endElementNSs   z&ElementTreeContentHandler.endElementNScCs0|rtdd|D}|d|f||dS)NcSsg|]\}}d|f|fqSrr).0kvrrr z:ElementTreeContentHandler.startElement..)dictr8rB)r!namer=rrr startElements z&ElementTreeContentHandler.startElementcCs|d|f|dSr)rF)r!rMrrr endElementsz$ElementTreeContentHandler.endElementcCsN|jd}z|d}|jpd||_Wn"tyH|jp.rr:)rfr8lenmin)r!r2r3rercrdr*Z candidatesrrirrgs  z ElementTreeProducer._build_qnameN)r r r r rrbrargrrrrrVs  6rVcCst||S)zlOne-shot helper to generate SAX events from an XML tree and fire them against a SAX ContentHandler. )rVrb)r\r]rrrrbsrbN)r Z __future__rZxml.sax.handlerrZlxmlrZ lxml.etreerrrrZ LxmlErrorr rrobjectrVrbrrrrs   |s