a 9ziD @sdZddlZddlZddlmZmZmZmZddlTddl m Z m Z ej j jej j jfZGdddej j Z ee dd d ee d d d ee d dd ddZddZddZddZGddde ZGddde Zeeddd eed dd eeddd Gd d!d!eZeed"d#d eZGd$d%d%eZeddZGd&d'd'e Zeed(d)d eed d*d d+d,ZGd-d.d.ZGd/d0d0ee Z Gd1d2d2ee Z!ee!d"d3d Gd4d5d5e!Z"ee"d6d7d ee"d8d9d d:d;Z#dd?d?e!Z%Gd@dAdAe"Z&GdBdCdCeZ'ee'd"dDd GdEdFdFZ(GdGdHdHe(ee Z)GdIdJdJe(e Z*GdKdLdLe(ee Z+GdMdNdNe Z,GdOdPdPeZ-dQdRZ.GdSdTdTe e Z/ee/dUdVd dWdXZ0dYdZZ1d[d\Z2dcd]d^Z3ddd_d`Z4dedadbZ5dS)facSimple implementation of the Level 1 DOM. Namespaces and other minor Level 2 features are also supported. parse("foo.xml") parseString("") Todo: ===== * convenience methods for getting elements and text. * more testing * bring some of the writer and linearizer code into conformance with this interface * SAX 2 namespaces N)EMPTY_NAMESPACE EMPTY_PREFIXXMLNS_NAMESPACEdomreg)*)DOMImplementationLS DocumentLSc@seZdZdZdZdZdZdZeZ ddZ d2ddZ d3dd Z d d Z d d ZddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Z dS)4NodeNcCsdS)NTselfr r '/usr/lib64/python3.9/xml/dom/minidom.py__bool__+sz Node.__bool__cCs|dd||SN) toprettyxml)r encoding standaloner r r toxml.sz Node.toxml  cCsz|durt}ntjt|ddd}|jtjkrJ||d||||n||d|||durj|S| SdS)Nxmlcharrefreplacer)rerrorsnewliner) ioStringIO TextIOWrapperBytesIOnodeTyper DOCUMENT_NODEwritexmlgetvaluedetach)r indentnewlrrwriterr r r r1s   zNode.toprettyxmlcCs t|jSN)bool childNodesr r r r hasChildNodesDszNode.hasChildNodescCs|jSr&r(r r r r _get_childNodesGszNode._get_childNodescCs|jr|jdSdSNrr*r r r r _get_firstChildJszNode._get_firstChildcCs|jr|jdSdSNr*r r r r _get_lastChildNszNode._get_lastChildcCs|j|jkr,t|jD]}|||q|S|j|jvrTtjdt |t |f|j durj|j ||dur~| |nz|j |}WntytjYn0|jtvrt||j||||_||_|r|j|d}||_||_nd|_||_ |S)N%s cannot be child of %s)rDOCUMENT_FRAGMENT_NODEtupler( insertBefore_child_node_typesxmldomHierarchyRequestErrrepr parentNode removeChild appendChildindex ValueError NotFoundErr_nodeTypes_with_children_clear_id_cacheinsert nextSiblingpreviousSibling)r newChildrefChildcr>noder r r r5Rs8       zNode.insertBeforecCs|j|jkr*t|jD]}||q|S|j|jvrTtjdt |t |fn|jt vrft ||j dur||j |t||d|_|SNr1)rr3r4r(r=r6r7r8r9r:rArBr;r< _append_childrD)r rIrHr r r r=rs       zNode.appendChildcCs|j|jkr(|j}|||||S|j|jvrPtjdt |t |f||ur\dS|j durr|j |z|j |}Wnt ytjYn0||j |<||_ d|_ |jtvs|jtvrt||j|_|j|_d|_d|_|jr||j_|jr ||j_|SrJ)rr3rDr<r5r6r7r8r9r:r;r(r>r?r@rArBrE)r rFoldChildrGr>r r r replaceChilds@         zNode.replaceChildcCs~z|j|Wnty,tjYn0|jdurB|j|j_|jdurV|j|j_d|_|_|jt vrtt |d|_ |Sr&) r(remover?r7r8r@rDrErrArBr;r rLr r r r<s       zNode.removeChildcCsg}|jD]}|jtjkr|jsJ|r0|j|d_|jr@|j|j_|q|r|dj|jkr|d}|j|j|_|j|_|jr||j_|q||q |||jtj kr | q ||jdd<dSr.) r(rr TEXT_NODEdatarDrEunlinkappend ELEMENT_NODE normalize)r LchildrIr r r rUs*          zNode.normalizecCst|||jp|Sr&) _clone_node ownerDocument)r deepr r r cloneNodeszNode.cloneNodecCs|jj||Sr&)rYimplementation hasFeaturer featureversionr r r isSupportedszNode.isSupportedcCsdSr&r r r r r _get_localNameszNode._get_localNamecCs||uSr&r r otherr r r isSameNodeszNode.isSameNodecCs||dr|SdSdSr&)rar r_r r r getInterfaces zNode.getInterfacec Cs.z|j|dWSttfy(YdS0dSr,) _user_dataAttributeErrorKeyErrorr keyr r r getUserDataszNode.getUserDatacCsld}z |j}Wnty*i}||_Yn0||vr@||d}|dur\d}|durh||=n ||f||<|Sr,)rhri)r rlrQhandlerolddr r r setUserDatas     zNode.setUserDatacCsDt|dr@t|jD]&\}\}}|dur||||||qdS)Nrh)hasattrlistrhitemshandle)r operationsrcdstrlrQrnr r r _call_user_data_handlers zNode._call_user_data_handlercCs>d|_|_|jr.|jD] }|qt|_d|_d|_dSr&)r;rYr(rRNodeListrErD)r rWr r r rRs   z Node.unlinkcCs|Sr&r r r r r __enter__szNode.__enter__cCs |dSr&)rR)r etZevtbr r r __exit__sz Node.__exit__)NN)rrNN)!__name__ __module__ __qualname__ namespaceURIr;rYrDrErprefixrrrr)r+r-r0r5r=rMr<rUr[rarbrergrmrqryrRr{r~r r r r r "s>      r firstChildzFirst child node, or None.)doc lastChildzLast child node, or None. localNamez"Namespace-local name of this node.cCs2|j}|r|d}||_||_||||_dSr.)r(rErDrSr;)r rIr(lastr r r rKs rKcCs6|r2|dddddddd}||d S) zWrites datachars to writer.&z&z>N)replacewrite)r%rQr r r _write_data(srcCsD|jD]8}|jtjkr2|dks(|j|kr2||t|||q|SNr)r(rr rTtagNamerS_get_elements_by_tagName_helper)parentnamercrIr r r r/s   rcCsX|jD]L}|jtjkr|dks(|j|krD|dks:|j|krD||t||||q|Sr)r(rr rTrrrS"_get_elements_by_tagName_ns_helper)rZnsURIrrrIr r r r7s   rc@sJeZdZejZdZdZdZdZ ej ej ej ej ejejejfZddZdS)DocumentFragmentz#document-fragmentNcCs t|_dSr&)rzr(r r r r __init__NszDocumentFragment.__init__)rrrr r3rnodeName nodeValue attributesr;rTrPCDATA_SECTION_NODEENTITY_REFERENCE_NODEPROCESSING_INSTRUCTION_NODE COMMENT_NODE NOTATION_NODEr6rr r r r r@src@seZdZdZejZdZdZdZ ej ej fZ e ddfddZddZdd Zd d Zd d ZeeeZZddZddZeeeZZddZddZeeeZddZddZddZdS)Attr)_name_valuer_prefixr( _localNamerY ownerElementNFcCs8d|_d|_||_||_||_t|_|jtdSr&) rrYrrrrzr(rSText)r qNamerrrr r r r\sz Attr.__init__cCs2z|jWSty,|jdddYS0dSN:r2r/)rrirsplitr r r r rbjs zAttr._get_localNamecCs|jSr&) specifiedr r r r _get_specifiedpszAttr._get_specifiedcCs|jSr&)rr r r r _get_namesszAttr._get_namecCs||_|jdurt|jdSr&)rrrBr valuer r r _set_namevs zAttr._set_namecCs|jSr&)rr r r r _get_value}szAttr._get_valuecCs6||_||jd_|jdur&t|j||jd_dSr,)rr(rQrrBrr r r _set_values    zAttr._set_valuecCs|jSr&)rr r r r _get_prefixszAttr._get_prefixcCsd|j}|dkr&|r&|tkr&tjd||_|dur<|j}nd||jf}|jrZt|j||_ dS)Nxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s) rrr7r8 NamespaceErrrrrrBr)r rZnsuriZnewNamer r r _set_prefixs  zAttr._set_prefixcCsv|j}|durR|j|j=|j|j|jf=|jrRd|_|jd8_|jj d8_ |j D] }| qX|j dd=dS)NFr2) r_attrsr_attrsNSrr_is_id_magic_id_nodesrY_magic_id_countr(rR)r elemrWr r r rRs   z Attr.unlinkcCsf|jr dS|j}|j}|dus&|dur*dS||}|dur@dS|jrV||j|jS||jSdSNTF) rrYr_get_elem_inforisIdNSrisIdrr rrinfor r r _get_isIds zAttr._get_isIdcCs\|j}|j}|dus|dur tS||}|dur6tS|jrL||j|jS||jSdSr&) rYr_no_typerrgetAttributeTypeNSrgetAttributeTyperrr r r _get_schemaTypes zAttr._get_schemaType) rrr __slots__r ATTRIBUTE_NODErrrrrPrr6rrrbrrrpropertyrrrrrrrrrrRrrr r r r rRs.   rrz True if this attribute is an ID.z'Namespace-local name of this attribute. schemaTypezSchema type for this attribute.c@seZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ d:ddZeZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Z dS); NamedNodeMapaThe attribute list is a transient interface to the underlying dictionaries. Mutations here will change the underlying element's dictionary. Ordering is imposed artificially and does not reflect the order of attributes as found in an input document. rr _ownerElementcCs||_||_||_dSr&r)r attrsZattrsNSrr r r rszNamedNodeMap.__init__cCs t|jSr&)lenrr r r r _get_lengthszNamedNodeMap._get_lengthcCs2z|t|j|WSty,YdS0dSr&)rsrkeys IndexErrorr r>r r r items zNamedNodeMap.itemcCs*g}|jD]}||j|jfq|Sr&)rvaluesrSrrr rVrIr r r rtszNamedNodeMap.itemscCs0g}|jD]}||j|jf|jfq|Sr&)rrrSrrrrr r r itemsNSszNamedNodeMap.itemsNScCs"t|tr||jvS||jvSdSr&) isinstancestrrrrkr r r __contains__s  zNamedNodeMap.__contains__cCs |jSr&)rrr r r r rszNamedNodeMap.keyscCs |jSr&)rrr r r r keysNSszNamedNodeMap.keysNScCs |jSr&)rrr r r r rszNamedNodeMap.valuesNcCs|j||Sr&rget)r rrr r r rszNamedNodeMap.getcCs:|jt|ddurdSt|t|kt|t|kSdS)Nrr)rgetattridrcr r r _cmp szNamedNodeMap._cmpcCs||dkSr,rrcr r r __eq__szNamedNodeMap.__eq__cCs||dkSr,rrcr r r __ge__szNamedNodeMap.__ge__cCs||dkSr,rrcr r r __gt__szNamedNodeMap.__gt__cCs||dkSr,rrcr r r __le__szNamedNodeMap.__le__cCs||dkSr,rrcr r r __lt__szNamedNodeMap.__lt__cCs"t|tr|j|S|j|SdSr&)rr4rr)r attname_or_tupler r r __getitem__s  zNamedNodeMap.__getitem__cCstt|trPz|j|}Wn.tyFt|}|jj|_||Yn0||_n t|tsbt d|}||dS)Nz%value must be a string or Attr object) rrrrjrrrY setNamedItemr TypeError)r attnamerrIr r r __setitem__&s    zNamedNodeMap.__setitem__cCs&z |j|WSty YdS0dSr&)rrjr rr r r getNamedItem5s  zNamedNodeMap.getNamedItemcCs*z|j||fWSty$YdS0dSr&)rrjr rrr r r getNamedItemNS;s zNamedNodeMap.getNamedItemNScCsX||}|durJt|j|j|j=|j|j|jf=t|drFd|_ |St j dSNr) rrBrrrrrrrrrr7r8r@r rnr r r removeNamedItemAs    zNamedNodeMap.removeNamedItemcCsZ|||}|durLt|j|j|j|jf=|j|j=t|drHd|_ |St j dSr) rrBrrrrrrrrrr7r8r@r rrrr r r removeNamedItemNSMs    zNamedNodeMap.removeNamedItemNScCstt|ts&tjdt|t|f|j|j}|r@| ||j|j<||j |j |j f<|j |_t|j|SrJ)rrr7r8r9r:rrrrRrrrrrrB)r rIror r r rYs   zNamedNodeMap.setNamedItemcCs ||Sr&)rr rIr r r setNamedItemNSfszNamedNodeMap.setNamedItemNScCs||}t|j|dSr&)rBrrR)r rrIr r r __delitem__is zNamedNodeMap.__delitem__cCs|j|j|jfSr&rr r r r __getstate__nszNamedNodeMap.__getstate__cCs|\|_|_|_dSr&rr stater r r __setstate__qszNamedNodeMap.__setstate__)N)!rrr__doc__rrrrrtrrrrrr__len__rrrrrrrrrrrrrrrrrr r r r rs<    rlengthz$Number of nodes in the NamedNodeMap.c@s0eZdZdZddZddZddZdd Zd S) TypeInfo namespacercCs||_||_dSr&r)r rrr r r r}szTypeInfo.__init__cCs2|jrd|jj|j|jfSd|jj|jfSdS)Nz<%s %r (from %r)>z<%s %r>)r __class__rrr r r r __repr__s  zTypeInfo.__repr__cCs|jSr&)rr r r r rszTypeInfo._get_namecCs|jSr&)rr r r r _get_namespaceszTypeInfo._get_namespaceN)rrrrrrrrr r r r rzs rc@s eZdZdZejZdZeZ dZ ejej ej ej ejejfZeddfddZddZdd Zd d Zd d ZddZddZddZddZddZddZddZeZddZddZ d d!Z!e!Z"d"d#Z#d$d%Z$d&d'Z%d(d)Z&d*d+Z'd9d-d.Z(d/d0Z)d1d2Z*d3d4Z+d5d6Z,d7d8Z-dS):Element) rYr;rrrrrr(rrrDrENrcCsHd|_d|_||_|_||_||_t|_d|_|_ d|_ d|_ dSr&) rYr;rrrrrzr(rDrErr)r rrrrr r r rs  zElement.__init__cCs|jduri|_i|_dSr&)rrr r r r _ensure_attributess zElement._ensure_attributescCs2z|jWSty,|jdddYS0dSr)rrirrr r r r rbs zElement._get_localNamecCs|jSr&rr r r r _get_tagNameszElement._get_tagNamecCs@|jdur&t|jD] }|qd|_d|_t|dSr&)rrsrrRrr )r attrr r r rRs   zElement.unlinkcCs6|jdurdSz|j|jWSty0YdS0dS)aReturns the value of the specified attribute. Returns the value of the element's attribute named attname as a string. An empty string is returned if the element does not have such an attribute. Note that an empty string may also be returned as an explicitly given attribute value, use the hasAttribute method to distinguish these two cases. Nr)rrrj)r rr r r getAttributes  zElement.getAttributecCs:|jdurdSz|j||fjWSty4YdS0dSr)rrrjrr r r getAttributeNSs   zElement.getAttributeNScCsV||}|dur4t|}||_|j|_||n||jkrR||_|jrRt|dSr&)getAttributeNoderrrYsetAttributeNoderrB)r rrr r r r setAttributes   zElement.setAttributecCst|\}}|||}|durHt||||}||_|j|_||n4||jkrf||_|jrft||j|kr|||_||_ dSr&) _nssplitgetAttributeNodeNSrrrYrrrBrr)r r qualifiedNamerr localnamer r r r setAttributeNSs     zElement.setAttributeNScCs|jdurdS|j|Sr&r)r attrnamer r r rs zElement.getAttributeNodecCs|jdurdS|j||fSr&)rrrr r r rs zElement.getAttributeNodeNScCs|jd|fvrtjd||j|jd}|durD|||j |j |j fd}|durt||urt||t ||||ur|S||ur|SdS)Nzattribute node already owned) rr7r8ZInuseAttributeErrr rrrremoveAttributeNoderrr_set_attribute_node)r r Zold1Zold2r r r r s    zElement.setAttributeNodecCsN|jdurtjz|j|}Wnty>tjYn0||dSr&)rr7r8r@rrjr)r rr r r r removeAttribute s   zElement.removeAttributecCsR|jdurtjz|j||f}WntyBtjYn0||dSr&)rr7r8r@rjr)r rrr r r r removeAttributeNS)s   zElement.removeAttributeNScCs\|durtjz|j|jWnty>tjYn0t|||j|_|Sr&) r7r8r@rrrjrBrRrYrr r r r2s  zElement.removeAttributeNodecCs|jdurdS||jvS)zChecks whether the element has an attribute with the specified name. Returns True if the element has an attribute with the specified name. Otherwise, returns False. NFrrr r r hasAttributeBs zElement.hasAttributecCs|jdurdS||f|jvSNF)rrr r r hasAttributeNSLs zElement.hasAttributeNScCst||tS)zReturns all descendant elements with the given tag name. Returns the list of all descendant elements (not direct children only) with the specified tag name. rrzrr r r getElementsByTagNameQszElement.getElementsByTagNamecCst|||tSr&rrzrr r r getElementsByTagNameNSYs zElement.getElementsByTagNameNScCsd|jt|fS)Nz)rrr r r r r]szElement.__repr__rcCs||d|j|}|D],}|d|t|||j|dq$|jr|dt|jdkr|jdjt j t j fvr|jd |dddn4|||jD]}| |||||q|||d|j|fn|d |d S) zWrite an XML element to a file-like object Write the element to the writer object that must provide a write method (e.g. a file or StringIO object). rz %s="rrr2rrz%sz/>%sN) rr_get_attributesrrrr(rrr rPrr )r r%r# addindentr$rZa_namerIr r r r `s(        zElement.writexmlcCs|t|j|j|Sr&)r rrrr r r r r%szElement._get_attributescCs|jr dSdSdSrrr r r r hasAttributesszElement.hasAttributescCs||}||dSr&)rsetIdAttributeNode)r ridAttrr r r setIdAttributes zElement.setIdAttributecCs|||}||dSr&)rr()r rrr)r r r setIdAttributeNSs zElement.setIdAttributeNScCsj|dus||jstjt|dur4tj|jsfd|_|jd7_|j j d7_ t |dS)NTr2) rerr7r8r@_get_containing_entrefNoModificationAllowedErrrrrYrrB)r r)r r r r(s   zElement.setIdAttributeNode)rrr).rrrrr rTrrrrrrrrPrrr6rrr rbr rRrrrrrrrZsetAttributeNodeNSrrrZremoveAttributeNodeNSrr r"r$rr r%r'r*r+r(r r r r r sT      r rz*NamedNodeMap of attributes on the element.z%Namespace-local name of this element.cCs8t||||j|j<||j|j|jf<||_dSr&)rBr rrrrrr)elementr r r r rs  rc@sfeZdZdZdZdZeZdZdZ ddZ ddZ dd Z d d Z d d ZddZddZddZdS) ChildlesszMixin that makes childless-ness easy to implement and avoids the complexity of the Node methods that deal with children. r NcCsdSr&r r r r r r-szChildless._get_firstChildcCsdSr&r r r r r r0szChildless._get_lastChildcCstj|jddS)Nz nodes cannot have childrenr7r8r9rrr r r r=szChildless.appendChildcCsdSrr r r r r r)szChildless.hasChildNodescCstj|jddSNz nodes do not have childrenr0r rFrGr r r r5szChildless.insertBeforecCstj|jddSr1)r7r8r@rrOr r r r<szChildless.removeChildcCsdSr&r r r r r rUszChildless.normalizecCstj|jddSr1r0r rFrLr r r rMszChildless.replaceChild)rrrrrrZ EmptyNodeListr(rrr-r0r=r)r5r<rUrMr r r r r/sr/c@s\eZdZejZdZddZddZddZ e ee Z dd Z d d Z e e e Zdd dZdS)ProcessingInstructiontargetrQcCs||_||_dSr&r5)r r6rQr r r rszProcessingInstruction.__init__cCs|jSr&rQr r r r _get_nodeValuesz$ProcessingInstruction._get_nodeValuecCs ||_dSr&r7rr r r _set_nodeValuesz$ProcessingInstruction._set_nodeValuecCs|jSr&r6r r r r _get_nodeNamesz#ProcessingInstruction._get_nodeNamecCs ||_dSr&r:rr r r _set_nodeNamesz#ProcessingInstruction._set_nodeNamercCs|d||j|j|fdS)Nz %s%s)rr6rQr r%r#r&r$r r r r szProcessingInstruction.writexmlN)rrr)rrrr rrrrr8r9rrr;r<rr r r r r r4s  r4c@sreZdZdZddZddZeZddZdd Ze eeZ Z d d Z d d Z ddZddZddZddZdS) CharacterData)_datarYr;rErDcCs,d|_|_d|_|_d|_t|dSr)rYr;rErDr?r rr r r r rs  zCharacterData.__init__cCs t|jSr&)rrQr r r r rszCharacterData._get_lengthcCs|jSr&r?r r r r _get_dataszCharacterData._get_datacCs ||_dSr&r@r rQr r r _set_dataszCharacterData._set_datacCs6|j}t|dkrd}nd}d|jj|dd|fS)N z...rzr)rQrrr)r rQZ dotdotdotr r r rs zCharacterData.__repr__cCsT|dkrtjd|t|jkr.tjd|dkrBtjd|j|||SNroffset cannot be negative#offset cannot be beyond end of datacount cannot be negativer7r8 IndexSizeErrrrQr offsetcountr r r substringDatas   zCharacterData.substringDatacCs|j||_dSr&r7)r argr r r appendDataszCharacterData.appendDatacCsZ|dkrtjd|t|jkr.tjd|rVd|jd|||j|df|_dS)NrrFrG%s%s%srI)r rLrOr r r insertDatas  zCharacterData.insertDatacCsl|dkrtjd|t|jkr.tjd|dkrBtjd|rh|jd||j||d|_dSrErIrKr r r deleteData%s   zCharacterData.deleteDatacCsr|dkrtjd|t|jkr.tjd|dkrBtjd|rnd|jd|||j||df|_dS)NrrFrGrHrQrI)r rLrMrOr r r replaceData/s   zCharacterData.replaceDataN)rrrrrrrrArCrrQrrrNrPrRrSrTr r r r r>s    r>zLength of the string data.c@sHeZdZdZejZdZdZddZ dddZ d d Z d d Z d dZ dS)rr z#textNcCs|dks|t|jkr"tjd|}|j|d|_|j|_|j}|jr~||jj vr~|durp|j |n|j |||jd||_|S)Nrzillegal offset value) rrQr7r8rJrrYrDr;r(r=r5)r rLZnewTextnextr r r splitTextDs zText.splitTextrcCst|d||j|fdS)NrQ)rrQr=r r r r Ssz Text.writexmlcCs|jg}|j}|durB|jtjtjfvrB|d|j|j}qqBq|j}|durz|jtjtjfvrz||j|j}qHqzqHd |S)Nrr) rQrErr rPrrCrDrSjoin)r rVrr r r _get_wholeTextXs zText._get_wholeTextcCs|j}|j}|dur@|jtjtjfvr@|j}|||}q q@q |j}|sT|||dur|jtjtjfvr|j}|||}qTqqT|r||_|SdSdSr&) r;rErr rPrr<rDrQ)r ZcontentrrrUr r r replaceWholeTextjs*   zText.replaceWholeTextcCsF|jrdSt|}|dur"dS|j|}|dur:dS|SdSr)rQstrip_get_containing_elementrYrisElementContent)r rrr r r !_get_isWhitespaceInElementContents  z&Text._get_isWhitespaceInElementContent)rrr)rrrrr rPrrrrVr rXrYr]r r r r r=s rZisWhitespaceInElementContentzKTrue iff this text node contains only whitespace and is in element content.Z wholeTextz.The text of all logically-adjacent text nodes.cCs*|j}|dur&|jtjkr|S|j}qdSr&)r;rr rTrIrHr r r r[s  r[cCs*|j}|dur&|jtjkr|S|j}qdSr&)r;rr rr^r r r r,s  r,c@s(eZdZejZdZddZdddZdS) Commentz#commentcCst|||_dSr&)r>rr?rBr r r rs zComment.__init__rcCs,d|jvrtd|d||j|fdS)Nz--z%'--' is not allowed in a comment nodez %s%s)rQr?rr=r r r r s zComment.writexmlN)rrr) rrrr rrrrr r r r r r_sr_c@s$eZdZdZejZdZdddZdS) CDATASectionr z#cdata-sectionrcCs,|jddkrtd|d|jdS)Nz]]>rz$']]>' not allowed in a CDATA sectionz)rQfindr?rr=r r r r szCDATASection.writexmlN)rrr) rrrrr rrrr r r r r r`sr`c@szeZdZdZdddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZdS)ReadOnlySequentialNamedNodeMap_seqr cCs ||_dSr&rc)r seqr r r rsz'ReadOnlySequentialNamedNodeMap.__init__cCs t|jSr&rrdr r r r rsz&ReadOnlySequentialNamedNodeMap.__len__cCs t|jSr&rfr r r r rsz*ReadOnlySequentialNamedNodeMap._get_lengthcCs"|jD]}|j|kr|SqdSr&)rdrrr r r rs  z+ReadOnlySequentialNamedNodeMap.getNamedItemcCs,|jD] }|j|kr|j|kr|SqdSr&)rdrrrr r r rs z-ReadOnlySequentialNamedNodeMap.getNamedItemNScCs4t|tr|j|}n ||}|dur0t||Sr&)rr4rrrj)r Z name_or_tuplerIr r r rs    z*ReadOnlySequentialNamedNodeMap.__getitem__cCs2|dkr dSz |j|WSty,YdS0dSr,)rdrrr r r rs   z#ReadOnlySequentialNamedNodeMap.itemcCstjddSNz"NamedNodeMap instance is read-onlyr7r8r-rr r r rsz.ReadOnlySequentialNamedNodeMap.removeNamedItemcCstjddSrgrhrr r r rsz0ReadOnlySequentialNamedNodeMap.removeNamedItemNScCstjddSrgrhrr r r rsz+ReadOnlySequentialNamedNodeMap.setNamedItemcCstjddSrgrhrr r r rsz-ReadOnlySequentialNamedNodeMap.setNamedItemNScCs|jgSr&rcr r r r rsz+ReadOnlySequentialNamedNodeMap.__getstate__cCs|d|_dSr,rcrr r r rsz+ReadOnlySequentialNamedNodeMap.__setstate__N)r )rrrrrrrrrrrrrrrrrr r r r rbs  rbz&Number of entries in the NamedNodeMap.c@s,eZdZdZdZddZddZddZd S) Identifiedz@Mix-in class that supports the publicId and systemId attributes.publicIdsystemIdcCs||_||_dSr&rj)r rkrlr r r _identified_mixin_init sz!Identified._identified_mixin_initcCs|jSr&)rkr r r r _get_publicIdszIdentified._get_publicIdcCs|jSr&)rlr r r r _get_systemIdszIdentified._get_systemIdN)rrrrrrmrnror r r r ris ric@sHeZdZejZdZdZdZdZ dZ ddZ ddZ ddZ d d d ZdS) DocumentTypeNcCs2t|_t|_|r&t|\}}||_|j|_dSr&)rbentities notationsrrr)r rrrr r r rs  zDocumentType.__init__cCs|jSr&)internalSubsetr r r r _get_internalSubset%sz DocumentType._get_internalSubsetcCs|jdurtd}|j|_|j|_tjjj}|rg|j_ g|j _ |j j D]2}t |j|j |j }|j j |||||qH|jj D]N}t|j|j |j |j}|j|_|j|_|j|_|jj |||||q|||||SdSdSr&)rYrprrr7r8UserDataHandler NODE_CLONEDrqrdrrNotationrkrlrSryEntity notationNameactualEncodingrr`)r rZclonervrnotationeentityr r r r[(s0    zDocumentType.cloneNodercCs|d||j|jr8|d||j||jfn|jrR|d||jf|jdur||d||j|d|d|dS)Nz        z DOMImplementation.createDocumentcCst|}||_||_|Sr&)rprkrl)r rrkrlrr r r createDocumentTypesz$DOMImplementation.createDocumentTypecCs||dr|SdSdSr&)r]rfr r r rgs zDOMImplementation.getInterfacecCstSr&)Documentr r r r rsz"DOMImplementation._create_documentN) rrrrr]rrrgrr r r r rs  -rc@s\eZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ dS) ElementInfozObject that represents content-model information for an element. This implementation is not expected to be used in practice; DOM builders should provide implementations which do the right thing using information available to it. r cCs ||_dSr&r rr r r rszElementInfo.__init__cCstSr&rr Zanamer r r rszElementInfo.getAttributeTypecCstSr&rrr r r rszElementInfo.getAttributeTypeNScCsdSrr r r r r r\szElementInfo.isElementContentcCsdS)zQReturns true iff this element is declared to have an EMPTY content model.Fr r r r r isEmptyszElementInfo.isEmptycCsdS)z7Returns true iff the named attribute is a DTD-style ID.Fr rr r r rszElementInfo.isIdcCsdS)zd?Z8d@dAZ9dBdCZ:dIdEdFZ;dGdHZ|j||jtj kr^| r^tjdt ||S)Nr1z two document elements disallowed) rr6r7r8r9r:r;r<r rT_get_documentElementr=rr r r r=Fs    zDocument.appendChildcCsTz|j|Wnty,tjYn0d|_|_d|_|j |urPd|_ |Sr&) r(rNr?r7r8r@rDrEr;documentElementrOr r r r<Vs   zDocument.removeChildcCs$|jD]}|jtjkr|SqdSr&)r(rr rTrr r r rbs  zDocument._get_documentElementcCs(|jdur|jd|_t|dSr&)rrRr r r r r rRgs  zDocument.unlinkcCs|sdS|jddd}|j|_|j|_|j|_|jD]B}t|||}|j||jt j kr`n|jt j krr||_ ||_ q6|tjjj|||Sr&)r\rrrr`r(rXrSrr rrrr;ryr7r8rurv)r rZr{rZ childcloner r r r[ms$      zDocument.cloneNodecCst}||_|Sr&)rrY)r rpr r r createDocumentFragmentszDocument.createDocumentFragmentcCst|}||_|Sr&)r rY)r rr}r r r createElementszDocument.createElementcCs(t|tstdt}||_||_|SNznode contents must be a string)rrrrrQrY)r rQtr r r createTextNodes  zDocument.createTextNodecCs(t|tstdt}||_||_|Sr)rrrr`rQrYr rQrHr r r createCDATASections  zDocument.createCDATASectioncCst|}||_|Sr&)r_rYrr r r createCommentszDocument.createCommentcCst||}||_|Sr&)r4rY)r r6rQpr r r createProcessingInstructions z$Document.createProcessingInstructioncCst|}||_d|_|Sr)rrYr)r rar r r createAttributeszDocument.createAttributecCs"t|\}}t|||}||_|Sr&)rr rY)r rrrrr}r r r rs  zDocument.createElementNScCs*t|\}}t||||}||_d|_|Sr)rrrYr)r rrrrrr r r createAttributeNSs  zDocument.createAttributeNScCst||||}||_|Sr&)rxrY)r rrkrlryr}r r r _create_entityszDocument._create_entitycCst|||}||_|Sr&)rwrY)r rrkrlrr r r _create_notations zDocument._create_notationcCs||jvr|j|S|js$|js$dS|j}|durB|jg}||_n|sJdSd}|r|}|dd|jD||}|rB|j D]}|j r| |j |j r||j|j<|j|kr|}n |jsqq||jr ||j|j<|j|kr|}n|js>qq|jr||j|j<|j|kr.|}q|jdkrqqn>|jr|j D]*}|jrT||j|j<|j|krT|}qT|durNqqN|S)NcSsg|]}|jtvr|qSr )rrA).0rWr r r s z+Document.getElementById..r2)rrrrrpopextendr(rrrrrrrrrrr)r rstackresultrIrr r r r getElementByIdsZ              zDocument.getElementByIdcCst||tSr&r!rr r r r"szDocument.getElementsByTagNamecCst|||tSr&r#rr r r r$s zDocument.getElementsByTagNameNScCs|j||Sr&)r\r]r^r r r raszDocument.isSupportedcCs>|jtjkrtjdn|jtjkr2tjdt|||S)Nzcannot import document nodesz!cannot import document type nodes)rr rr7r8NotSupportedErrrrX)r rIrZr r r importNode s    zDocument.importNoderc Csxg}|r|d|d|dur<|d|r0dndd|dd|d||jD]}|||||q^dS) Nz encoding="rz standalone="Zyesnoz)rSrrWr(r ) r r%r#r&r$rrZ declarationsrIr r r r s zDocument.writexmlcCsJ|j|ur tjd||jf|jtjtjfvr>tjd|t krd|vr| dd\}}|dkr|tjj krtj dq|dkr|tjj kr|jtjkrtj dd}|}nd}d}|jtjkr|j }|dur|j}||nd}||_||_||_||_|jtjkr||_n*||_|durF|||rF|||S)Nz?cannot rename nodes from other documents; expected %s, found %sz8renameNode() only applies to element and attribute nodesrr2rzillegal use of 'xmlns' prefixz$illegal use of the 'xmlns' attribute)rYr7r8rrr rTrrrrrrrrrrrrrrrrr()r rrrrrr.Zis_idr r r renameNode!sb         zDocument.renameNode)rrrNN)=rrrrr rTrrrr6rr\rrrrrr;rErDrzrrr`rrrrrrrrrrrrrrr=r<rrRr[rrrrrrrrrrrrr"r$rarr rr r r r rsl   : rrz#Top-level element of this document.c Cs|j|rtjjj}n tjjj}|jtj kr| |j |j }|j D]0}||j |j |j||j |j}|j|_qH|r|jD]}t|||}||qn|jtjkr|}|r|jD]}t|||}||qn|jtjkr||j}n|jtjkr||j}n|jtjkr>||j |j}nj|jtj!kr\|"|j}nL|jtj#kr|$|j |j }d|_|j|_n|jtj%krtjjj}|j&'|j(|j)|j*}||_|rg|j+_,g|j-_,|j-j,D]F} t.| j | j)| j*} || _|j-j,/| t0| dr| 1|| | q|j+j,D]b} t2| j | j)| j*| j3} | j4| _4| j5| _5| j6| _6|| _|j+j,/| t0| dr.| 1|| | q.ntj7dt8|t0|dr|1||||S)zo Clone a node and give it the new owner document. Called by Node.cloneNode and Document.importNode TryzCannot clone node %s)9rYrer7r8rurvZ NODE_IMPORTEDrr rTrrrrrrrrrrr(rXr=r3rrPrrQrrrrr6rrrrrr\rrrkrlrqrdrrrwrSrrryrxryrzrr`rr:) rIrZZnewOwnerDocumentrvr{r rrWrHrr|r}r~r r r rXZs                   rXcCs,|dd}t|dkr|Sd|dfSdS)Nrr2r)rr)rfieldsr r r rs  rcCs0||i|}|\}}||||Sr&)ZgetEventZ expandNoder)funcargskwargseventsZtoktypeZrootNoder r r _do_pulldom_parses   rcCsH|dur"|s"ddlm}||Sddlm}t|j|f||dSdS)z3Parse a file into a DOM by filename or file object.Nr expatbuilderpulldom)parserbufsize)xml.domrparserr)filerrrrr r r rs     rcCsB|durddlm}||Sddlm}t|j|fd|iSdS)z&Parse a file into a DOM from a string.Nrrrr)rr parseStringrr)stringrrrr r r rs    rcCs@|r:t|trt|}|D]\}}tj||sdSqtjSr&)rrrZ_parse_feature_stringrr\r])Zfeaturesfvr r r getDOMImplementations   r)NN)N)N)6rrrr7rrrrZxml.dom.minicompatZxml.dom.xmlbuilderrrr8r rTrrAZ defpropertyrKrrrrrobjectrZ AttributeListrrr rr/r4r>rr[r,r_r`rbrirprxrwrrrBrrXrrrrrr r r r sw  z$  )GU  ><( O*UR