a
    If	                    @   s  d Z ddlZddlZddlmZmZmZmZ ddlT ddl	m
Z
mZ ejjjejjjfZG dd dejjZeedd	d
 eeddd
 eeddd
 dd Zdd Zdd Zdd Zdd ZG dd deZG dd deZeeddd
 eeddd
 eed d!d
 G d"d# d#eZeed$d%d
 eZG d&d' d'eZeddZG d(d) d)eZeed*d+d
 eedd,d
 d-d. ZG d/d0 d0Z G d1d2 d2e eZ!G d3d4 d4e eZ"ee"d$d5d
 G d6d7 d7e"Z#ee#d8d9d
 ee#d:d;d
 d<d= Z$d>d? Z%G d@dA dAe"Z&G dBdC dCe#Z'G dDdE dEeZ(ee(d$dFd
 G dGdH dHZ)G dIdJ dJe)e eZ*G dKdL dLe)eZ+G dMdN dNe)e eZ,G dOdP dPe
Z-G dQdR dReZ.dSdT Z/G dUdV dVeeZ0ee0dWdXd
 dYdZ Z1d[d\ Z2d]d^ Z3ded_d`Z4dfdadbZ5dgdcddZ6dS )hac  Simple implementation of the Level 1 DOM.

Namespaces and other minor Level 2 features are also supported.

parse("foo.xml")

parseString("<foo><bar/></foo>")

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_PREFIXXMLNS_NAMESPACEdomreg)*)DOMImplementationLS
DocumentLSc                   @   s   e Zd ZdZdZdZdZdZeZ	dd Z
d2ddZd3dd	Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Z dS )4NodeNc                 C   s   dS )NT selfr
   r
    lib/python3.9/xml/dom/minidom.py__bool__+   s    zNode.__bool__c                 C   s   |  dd||S N )toprettyxml)r   encoding
standaloner
   r
   r   toxml.   s    z
Node.toxml	
c                 C   sz   |d u rt  }nt jt  |ddd}| jtjkrJ| |d|||| n| |d|| |d u rj| S |	  S d S )Nxmlcharrefreplacer   )r   errorsnewliner   )
ioStringIOTextIOWrapperBytesIOnodeTyper	   DOCUMENT_NODEwritexmlgetvaluedetach)r   indentnewlr   r   writerr
   r
   r   r   1   s    

zNode.toprettyxmlc                 C   s
   t | jS N)bool
childNodesr   r
   r
   r   hasChildNodesD   s    zNode.hasChildNodesc                 C   s   | j S r&   r(   r   r
   r
   r   _get_childNodesG   s    zNode._get_childNodesc                 C   s   | j r| j d S d S Nr   r*   r   r
   r
   r   _get_firstChildJ   s    zNode._get_firstChildc                 C   s   | j r| j d S d S Nr*   r   r
   r
   r   _get_lastChildN   s    zNode._get_lastChildc                 C   s  |j | jkr,t|jD ]}| || q|S |j | jvrTtjdt	|t	| f |j
d urj|j
| |d u r~| | nz| j|}W n ty   tj Y n0 |j tv rt|  | j|| ||_||_|r| j|d  }||_||_nd |_| |_
|S )N%s cannot be child of %s   )r   DOCUMENT_FRAGMENT_NODEtupler(   insertBefore_child_node_typesxmldomHierarchyRequestErrrepr
parentNoderemoveChildappendChildindex
ValueErrorNotFoundErr_nodeTypes_with_children_clear_id_cacheinsertnextSiblingpreviousSibling)r   newChildrefChildcr>   noder
   r
   r   r5   R   s8    

zNode.insertBeforec                 C   s   |j | jkr*t|jD ]}| | q|S |j | jvrTtjdt	|t	| f n|j t
v rft|  |jd ur||j| t| | d |_|S Nr1   )r   r3   r4   r(   r=   r6   r7   r8   r9   r:   rA   rB   r;   r<   _append_childrD   )r   rI   rH   r
   r
   r   r=   r   s    


zNode.appendChildc                 C   s  |j | jkr(|j}| | | ||S |j | jvrPtjdt	|t	| f ||u r\d S |j
d urr|j
| z| j|}W n ty   tj Y n0 || j|< | |_
d |_
|j tv s|j tv rt|  |j|_|j|_d |_d |_|jr||j_|jr||j_|S rJ   )r   r3   rD   r<   r5   r6   r7   r8   r9   r:   r;   r(   r>   r?   r@   rA   rB   rE   )r   rF   oldChildrG   r>   r
   r
   r   replaceChild   s@    



zNode.replaceChildc                 C   s~   z| j | W n ty,   tj Y n0 |jd urB|j|j_|jd urV|j|j_d  |_|_|jt	v rtt
|  d |_|S r&   )r(   remover?   r7   r8   r@   rD   rE   r   rA   rB   r;   r   rL   r
   r
   r   r<      s    




zNode.removeChildc                 C   s   g }| j D ]}|jtjkr|jsJ|r0|j|d _|jr@|j|j_|  q|r|d j|jkr|d }|j|j |_|j|_|jr||j_|  q|| q
|| |jtj	kr
|
  q
|| j d d < d S r.   )r(   r   r	   	TEXT_NODEdatarD   rE   unlinkappendELEMENT_NODE	normalize)r   LchildrI   r
   r
   r   rU      s*    





zNode.normalizec                 C   s   t | || jp| S r&   )_clone_nodeownerDocument)r   deepr
   r
   r   	cloneNode   s    zNode.cloneNodec                 C   s   | j j||S r&   )rY   implementation
hasFeaturer   featureversionr
   r
   r   isSupported   s    zNode.isSupportedc                 C   s   d S r&   r
   r   r
   r
   r   _get_localName   s    zNode._get_localNamec                 C   s   | |u S r&   r
   r   otherr
   r
   r   
isSameNode   s    zNode.isSameNodec                 C   s   |  |d r| S d S d S r&   )ra   r   r_   r
   r
   r   getInterface   s    zNode.getInterfacec              	   C   s.   z| j | d W S  ttfy(   Y d S 0 d S r,   )
_user_dataAttributeErrorKeyErrorr   keyr
   r
   r   getUserData   s    zNode.getUserDatac                 C   sl   d }z
| j }W n ty*   i }|| _ Y n0 ||v r@|| d }|d u r\d }|d urh||= n||f||< |S r,   )rh   ri   )r   rl   rQ   handlerolddr
   r
   r   setUserData   s    
zNode.setUserDatac                 C   sD   t | dr@t| j D ]&\}\}}|d ur|||||| qd S )Nrh   )hasattrlistrh   itemsZhandle)r   	operationsrcZdstrl   rQ   rn   r
   r
   r   _call_user_data_handler   s    
zNode._call_user_data_handlerc                 C   s>   d  | _ | _| jr.| jD ]}|  qt | _d | _d | _d S r&   )r;   rY   r(   rR   NodeListrE   rD   )r   rW   r
   r
   r   rR     s    

zNode.unlinkc                 C   s   | S r&   r
   r   r
   r
   r   	__enter__  s    zNode.__enter__c                 C   s   |    d S r&   )rR   )r   ZetZevtbr
   r
   r   __exit__  s    zNode.__exit__)NN)r   r   NN)!__name__
__module____qualname__namespaceURIr;   rY   rD   rE   r   prefixr   r   r   r)   r+   r-   r0   r5   r=   rM   r<   rU   r[   ra   rb   re   rg   rm   rq   rw   rR   ry   r{   r
   r
   r
   r   r	   "   s>   
  
  
r	   
firstChildzFirst child node, or None.)doc	lastChildzLast child node, or None.	localNamez"Namespace-local name of this node.c                 C   s2   | j }|r|d }||_||_|| | |_d S r.   )r(   rE   rD   rS   r;   )r   rI   r(   Zlastr
   r
   r   rK     s    
rK   c                 C   s$   | d ur | j tjkrdS | j} q dS NTF)r   r	   r   r;   rI   r
   r
   r   _in_document'  s
    r   c                 C   s6   |r2| dd dd dd dd}| | d	S )
zWrites datachars to writer.&z&amp;<z&lt;"z&quot;>z&gt;N)replacewrite)r%   rQ   r
   r
   r   _write_data/  s    r   c                 C   sD   | j D ]8}|jtjkr2|dks(|j|kr2|| t||| q|S Nr   )r(   r   r	   rT   tagNamerS   _get_elements_by_tagName_helper)parentnamercrI   r
   r
   r   r   6  s    

r   c                 C   sX   | j D ]L}|jtjkr|dks(|j|krD|dks:|j|krD|| t|||| q|S r   )r(   r   r	   rT   r   r   rS   "_get_elements_by_tagName_ns_helper)r   ZnsURIr   r   rI   r
   r
   r   r   >  s    

r   c                   @   sJ   e Zd ZejZdZdZdZdZ	ej
ejejejejejejfZdd ZdS )DocumentFragmentz#document-fragmentNc                 C   s   t  | _d S r&   )rx   r(   r   r
   r
   r   __init__U  s    zDocumentFragment.__init__)r|   r}   r~   r	   r3   r   nodeName	nodeValue
attributesr;   rT   rP   CDATA_SECTION_NODEENTITY_REFERENCE_NODEPROCESSING_INSTRUCTION_NODECOMMENT_NODENOTATION_NODEr6   r   r
   r
   r
   r   r   G  s   r   c                   @   s   e Zd ZdZejZdZdZdZ	ej
ejfZeddfddZdd Zdd	 Zd
d Zdd Zeee ZZdd Zdd Zeee ZZdd Zdd ZeeeZdd Zdd Zdd ZdS )Attr)_name_valuer   _prefixr(   
_localNamerY   ownerElementNFc                 C   s2   d | _ || _|| _|| _t | _| jt  d S r&   )r   r   r   r   rx   r(   rS   Text)r   qNamer   r   r   r
   r
   r   r   c  s    zAttr.__init__c                 C   s2   z| j W S  ty,   | jddd  Y S 0 d S N:r2   r/   )r   ri   r   splitr   r
   r
   r   rb   p  s    zAttr._get_localNamec                 C   s   | j S r&   )	specifiedr   r
   r
   r   _get_specifiedv  s    zAttr._get_specifiedc                 C   s   | j S r&   )r   r   r
   r
   r   	_get_namey  s    zAttr._get_namec                 C   s   || _ | jd urt| j d S r&   )r   r   rB   r   valuer
   r
   r   	_set_name|  s    
zAttr._set_namec                 C   s   | j S r&   )r   r   r
   r
   r   
_get_value  s    zAttr._get_valuec                 C   s6   || _ || jd _| jd ur&t| j || jd _d S r,   )r   r(   rQ   r   rB   r   r
   r
   r   
_set_value  s
    

zAttr._set_valuec                 C   s   | j S r&   )r   r   r
   r
   r   _get_prefix  s    zAttr._get_prefixc                 C   sd   | j }|dkr&|r&|tkr&tjd|| _|d u r<| j}nd|| jf }| jrZt| j || _	d S )Nxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
r   r   r7   r8   NamespaceErrr   r   r   rB   r   )r   r   ZnsuriZnewNamer
   r
   r   _set_prefix  s    
zAttr._set_prefixc                 C   sv   | j }|d urR|j| j= |j| j| jf= | jrRd| _| jd8  _| j j	d8  _	| j
D ]}|  qX| j
d d = d S )NFr2   )r   _attrsr   _attrsNSr   r   _is_id_magic_id_nodesrY   _magic_id_countr(   rR   )r   elemrW   r
   r
   r   rR     s    


zAttr.unlinkc                 C   sf   | j r
dS | j}| j}|d u s&|d u r*dS ||}|d u r@dS | jrV|| j| jS || jS d S r   )	r   rY   r   _get_elem_infor   isIdNSr   isIdr   r   r   r   infor
   r
   r   	_get_isId  s    
zAttr._get_isIdc                 C   s\   | j }| j}|d u s|d u r tS ||}|d u r6tS | jrL|| j| jS || jS d S r&   )	rY   r   _no_typer   r   getAttributeTypeNSr   getAttributeTyper   r   r
   r
   r   _get_schemaType  s    
zAttr._get_schemaType) r|   r}   r~   	__slots__r	   ATTRIBUTE_NODEr   r   r   r   rP   r   r6   r   r   rb   r   r   r   propertyr   r   r   r   r   r   r   r   r   rR   r   r   r
   r
   r
   r   r   Y  s.   

r   r   z True if this attribute is an ID.z'Namespace-local name of this attribute.
schemaTypezSchema type for this attribute.c                   @   s   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zd:ddZeZdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z dS );NamedNodeMapa  The 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.
    r   r   _ownerElementc                 C   s   || _ || _|| _d S r&   r   )r   attrsZattrsNSr   r
   r
   r   r     s    zNamedNodeMap.__init__c                 C   s
   t | jS r&   )lenr   r   r
   r
   r   _get_length  s    zNamedNodeMap._get_lengthc                 C   s2   z| t | j |  W S  ty,   Y d S 0 d S r&   )rs   r   keys
IndexErrorr   r>   r
   r
   r   item  s    zNamedNodeMap.itemc                 C   s*   g }| j  D ]}||j|jf q|S r&   )r   valuesrS   r   r   r   rV   rI   r
   r
   r   rt     s    zNamedNodeMap.itemsc                 C   s0   g }| j  D ]}||j|jf|jf q|S r&   )r   r   rS   r   r   r   r   r
   r
   r   itemsNS  s    zNamedNodeMap.itemsNSc                 C   s"   t |tr|| jv S || jv S d S r&   )
isinstancestrr   r   rk   r
   r
   r   __contains__  s    

zNamedNodeMap.__contains__c                 C   s
   | j  S r&   )r   r   r   r
   r
   r   r     s    zNamedNodeMap.keysc                 C   s
   | j  S r&   )r   r   r   r
   r
   r   keysNS  s    zNamedNodeMap.keysNSc                 C   s
   | j  S r&   )r   r   r   r
   r
   r   r     s    zNamedNodeMap.valuesNc                 C   s   | j ||S r&   r   get)r   r   r   r
   r
   r   r     s    zNamedNodeMap.getc                 C   s:   | j t|dd u rdS t| t|kt| t|k  S d S )Nr   r   )r   getattridrc   r
   r
   r   _cmp  s    zNamedNodeMap._cmpc                 C   s   |  |dkS r,   r   rc   r
   r
   r   __eq__  s    zNamedNodeMap.__eq__c                 C   s   |  |dkS r,   r   rc   r
   r
   r   __ge__  s    zNamedNodeMap.__ge__c                 C   s   |  |dkS r,   r   rc   r
   r
   r   __gt__  s    zNamedNodeMap.__gt__c                 C   s   |  |dkS r,   r   rc   r
   r
   r   __le__  s    zNamedNodeMap.__le__c                 C   s   |  |dk S r,   r   rc   r
   r
   r   __lt__"  s    zNamedNodeMap.__lt__c                 C   s"   t |tr| j| S | j| S d S r&   )r   r4   r   r   )r   attname_or_tupler
   r
   r   __getitem__%  s    

zNamedNodeMap.__getitem__c                 C   st   t |trPz| j| }W n. tyF   t|}| jj|_| | Y n0 ||_n t |tsbt	d|}| | d S )Nz%value must be a string or Attr object)
r   r   r   rj   r   r   rY   setNamedItemr   	TypeError)r   attnamer   rI   r
   r
   r   __setitem__,  s    


zNamedNodeMap.__setitem__c                 C   s&   z| j | W S  ty    Y d S 0 d S r&   )r   rj   r   r   r
   r
   r   getNamedItem;  s    zNamedNodeMap.getNamedItemc                 C   s*   z| j ||f W S  ty$   Y d S 0 d S r&   )r   rj   r   r   r   r
   r
   r   getNamedItemNSA  s    zNamedNodeMap.getNamedItemNSc                 C   sX   |  |}|d urJt| j | j|j= | j|j|jf= t|drFd |_	|S t
j d S Nr   )r   rB   r   r   r   r   r   r   rr   r   r7   r8   r@   r   r   nr
   r
   r   removeNamedItemG  s    



zNamedNodeMap.removeNamedItemc                 C   sZ   |  ||}|d urLt| j | j|j|jf= | j|j= t|drHd |_	|S t
j d S r   )r   rB   r   r   r   r   r   r   rr   r   r7   r8   r@   r   r   r   r   r
   r
   r   removeNamedItemNSS  s    


zNamedNodeMap.removeNamedItemNSc                 C   st   t |ts&tjdt|t| f | j|j}|r@|	  || j|j< || j
|j|jf< | j|_t|j |S rJ   )r   r   r7   r8   r9   r:   r   r   r   rR   r   r   r   r   r   rB   )r   rI   ro   r
   r
   r   r   _  s    

zNamedNodeMap.setNamedItemc                 C   s
   |  |S r&   )r   r   rI   r
   r
   r   setNamedItemNSl  s    zNamedNodeMap.setNamedItemNSc                 C   s   | | }t |j |  d S r&   )rB   r   rR   )r   r   rI   r
   r
   r   __delitem__o  s    
zNamedNodeMap.__delitem__c                 C   s   | j | j| jfS r&   r   r   r
   r
   r   __getstate__t  s    zNamedNodeMap.__getstate__c                 C   s   |\| _ | _| _d S r&   r   r   stater
   r
   r   __setstate__w  s    zNamedNodeMap.__setstate__)N)!r|   r}   r~   __doc__r   r   r   r   rt   r   r   r   r   r   r   __len__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r     s<   
r   Zlengthz$Number of nodes in the NamedNodeMap.c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )TypeInfo	namespacer   c                 C   s   || _ || _d S r&   r  )r   r  r   r
   r
   r   r     s    zTypeInfo.__init__c                 C   s2   | j rd| jj| j| j f S d| jj| jf S d S )Nz<%s %r (from %r)>z<%s %r>)r  	__class__r|   r   r   r
   r
   r   __repr__  s
    zTypeInfo.__repr__c                 C   s   | j S r&   )r   r   r
   r
   r   r     s    zTypeInfo._get_namec                 C   s   | j S r&   )r  r   r
   r
   r   _get_namespace  s    zTypeInfo._get_namespaceN)r|   r}   r~   r   r   r  r   r  r
   r
   r
   r   r     s
   r   c                   @   s   e Zd ZdZejZdZeZ	dZ
ejejejejejejfZeddfddZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZeZdd Zdd Z d d! Z!e!Z"d"d# Z#d$d% Z$d&d' Z%d(d) Z&d*d+ Z'd9d-d.Z(d/d0 Z)d1d2 Z*d3d4 Z+d5d6 Z,d7d8 Z-dS ):Element)rY   r;   r   r   r   r   r   r(   r   r   rD   rE   Nr   c                 C   sB   d | _ | | _| _|| _|| _t | _d  | _| _d | _	d | _
d S r&   )r;   r   r   r   r   rx   r(   rD   rE   r   r   )r   r   r   r   r   r
   r
   r   r     s    
zElement.__init__c                 C   s   | j d u ri | _ i | _d S r&   )r   r   r   r
   r
   r   _ensure_attributes  s    
zElement._ensure_attributesc                 C   s2   z| j W S  ty,   | jddd  Y S 0 d S r   )r   ri   r   r   r   r
   r
   r   rb     s    zElement._get_localNamec                 C   s   | j S r&   r   r   r
   r
   r   _get_tagName  s    zElement._get_tagNamec                 C   s@   | j d ur&t| j  D ]}|  qd | _ d | _t|  d S r&   )r   rs   r   rR   r   r	   )r   attrr
   r
   r   rR     s    

zElement.unlinkc                 C   s6   | j du rdS z| j | jW S  ty0   Y dS 0 dS )a  Returns 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   )r   r   rj   )r   r   r
   r
   r   getAttribute  s    	
zElement.getAttributec                 C   s:   | j d u rdS z| j ||f jW S  ty4   Y dS 0 d S r   )r   r   rj   r   r
   r
   r   getAttributeNS  s    
zElement.getAttributeNSc                 C   sV   |  |}|d u r4t|}||_| j|_| | n||jkrR||_|jrRt|  d S r&   )getAttributeNoder   r   rY   setAttributeNoder   rB   )r   r   r   r
  r
   r
   r   setAttribute  s    

zElement.setAttributec                 C   s   t |\}}| ||}|d u rHt||||}||_| j|_| | n4||jkrf||_|jrft|  |j|kr|||_||_	d S r&   )
_nssplitgetAttributeNodeNSr   r   rY   r  r   rB   r   r   )r   r   qualifiedNamer   r   	localnamer
  r
   r
   r   setAttributeNS  s    

zElement.setAttributeNSc                 C   s   | j d u rd S | j |S r&   r   )r   attrnamer
   r
   r   r    s    
zElement.getAttributeNodec                 C   s   | j d u rd S | j ||fS r&   )r   r   r   r
   r
   r   r    s    
zElement.getAttributeNodeNSc                 C   s   |j d | fvrtjd|   | j|jd }|d urD| | | j	|j
|jfd }|d urt||urt| | t| | ||ur|S ||ur|S d S )Nzattribute node already owned)r   r7   r8   ZInuseAttributeErrr  r   r   r   removeAttributeNoder   r   r   _set_attribute_node)r   r
  Zold1Zold2r
   r
   r   r    s    


zElement.setAttributeNodec                 C   sN   | j d u rtj z| j| }W n ty>   tj Y n0 | | d S r&   )r   r7   r8   r@   r   rj   r  )r   r   r
  r
   r
   r   removeAttribute%  s    

zElement.removeAttributec                 C   sR   | j d u rtj z| j ||f }W n tyB   tj Y n0 | | d S r&   )r   r7   r8   r@   rj   r  )r   r   r   r
  r
   r
   r   removeAttributeNS.  s    

zElement.removeAttributeNSc                 C   s\   |d u rt j z| j|j  W n ty>   t j Y n0 t|  |  | j|_|S r&   )	r7   r8   r@   r   r   rj   rB   rR   rY   r   r
   r
   r   r  7  s    
zElement.removeAttributeNodec                 C   s   | j du rdS || j v S )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.
        NFr   r   r
   r
   r   hasAttributeG  s    
zElement.hasAttributec                 C   s   | j d u rdS ||f| j v S NF)r   r   r
   r
   r   hasAttributeNSQ  s    
zElement.hasAttributeNSc                 C   s   t | |t S )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.
        r   rx   r   r
   r
   r   getElementsByTagNameV  s    zElement.getElementsByTagNamec                 C   s   t | ||t S r&   r   rx   r   r
   r
   r   getElementsByTagNameNS^  s    
zElement.getElementsByTagNameNSc                 C   s   d| j t| f S )Nz<DOM Element: %s at %#x>)r   r   r   r
   r
   r   r  b  s    zElement.__repr__r   c                 C   s   | |d | j  |  }| D ],}| d|  t||| j | d q$| jr| d t| jdkr| jd jt	j
t	jfv r| jd |ddd n4| | | jD ]}|||| || q| | | d| j|f  n| 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).
        r   z %s="r   r   r2   r   r   z</%s>%sz/>%sN)r   r   _get_attributesr   r   r   r(   r   r   r	   rP   r   r    )r   r%   r#   	addindentr$   r   Za_namerI   r
   r
   r   r    e  s(    	




zElement.writexmlc                 C   s   |    t| j| j| S r&   )r  r   r   r   r   r
   r
   r   r"    s    zElement._get_attributesc                 C   s   | j r
dS dS d S r   r  r   r
   r
   r   hasAttributes  s    zElement.hasAttributesc                 C   s   |  |}| | d S r&   )r  setIdAttributeNode)r   r   idAttrr
   r
   r   setIdAttribute  s    
zElement.setIdAttributec                 C   s   |  ||}| | d S r&   )r  r%  )r   r   r   r&  r
   r
   r   setIdAttributeNS  s    zElement.setIdAttributeNSc                 C   sj   |d u s|  |jstj t| d ur4tj |jsfd|_|  jd7  _| j	 j
d7  _
t|  d S )NTr2   )re   r   r7   r8   r@   _get_containing_entrefNoModificationAllowedErrr   r   rY   r   rB   )r   r&  r
   r
   r   r%    s    

zElement.setIdAttributeNode)r   r   r   ).r|   r}   r~   r   r	   rT   r   r   r   r   r   r   r   rP   r   r   r6   r   r   r  rb   r	  rR   r  r  r  r  r  r  r  ZsetAttributeNodeNSr  r  r  ZremoveAttributeNodeNSr  r  r  r!  r  r    r"  r$  r'  r(  r%  r
   r
   r
   r   r    sT   
		

 r  r   z*NamedNodeMap of attributes on the element.z%Namespace-local name of this element.c                 C   s8   t |  |   || j|j< || j|j|jf< | |_d S r&   )rB   r  r   r   r   r   r   r   )elementr
  r
   r
   r   r    s
    r  c                   @   sf   e Zd ZdZdZdZe ZdZdZ	dd Z
dd Zdd	 Zd
d Zdd Zdd Zdd Zdd ZdS )	ChildlesszMixin that makes childless-ness easy to implement and avoids
    the complexity of the Node methods that deal with children.
    r
   Nc                 C   s   d S r&   r
   r   r
   r
   r   r-     s    zChildless._get_firstChildc                 C   s   d S r&   r
   r   r
   r
   r   r0     s    zChildless._get_lastChildc                 C   s   t j| jd d S )Nz nodes cannot have childrenr7   r8   r9   r   r   r
   r
   r   r=     s    zChildless.appendChildc                 C   s   dS r  r
   r   r
   r
   r   r)     s    zChildless.hasChildNodesc                 C   s   t j| jd d S Nz nodes do not have childrenr-  r   rF   rG   r
   r
   r   r5     s    zChildless.insertBeforec                 C   s   t j| jd d S r.  )r7   r8   r@   r   rO   r
   r
   r   r<     s    zChildless.removeChildc                 C   s   d S r&   r
   r   r
   r
   r   rU     s    zChildless.normalizec                 C   s   t j| jd d S r.  r-  r   rF   rL   r
   r
   r   rM     s    zChildless.replaceChild)r|   r}   r~   r   r   r   ZEmptyNodeListr(   r   r   r-   r0   r=   r)   r5   r<   rU   rM   r
   r
   r
   r   r,    s   r,  c                   @   s\   e Zd ZejZdZdd Zdd Zdd Z	e
ee	Zdd	 Zd
d Ze
eeZdddZdS )ProcessingInstructiontargetrQ   c                 C   s   || _ || _d S r&   r2  )r   r3  rQ   r
   r
   r   r     s    zProcessingInstruction.__init__c                 C   s   | j S r&   rQ   r   r
   r
   r   _get_nodeValue  s    z$ProcessingInstruction._get_nodeValuec                 C   s
   || _ d S r&   r4  r   r
   r
   r   _set_nodeValue  s    z$ProcessingInstruction._set_nodeValuec                 C   s   | j S r&   r3  r   r
   r
   r   _get_nodeName  s    z#ProcessingInstruction._get_nodeNamec                 C   s
   || _ d S r&   r7  r   r
   r
   r   _set_nodeName  s    z#ProcessingInstruction._set_nodeNamer   c                 C   s   | d|| j| j|f  d S )Nz%s<?%s %s?>%s)r   r3  rQ   r   r%   r#   r#  r$   r
   r
   r   r      s    zProcessingInstruction.writexmlN)r   r   r   )r|   r}   r~   r	   r   r   r   r   r5  r6  r   r   r8  r9  r   r    r
   r
   r
   r   r1    s   

r1  c                   @   sr   e Zd ZdZdd Zdd ZeZdd Zdd	 Ze	ee Z
Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )CharacterData)_datarY   r;   rE   rD   c                 C   s,   d  | _ | _d  | _| _d| _t|  d S r   )rY   r;   rE   rD   r<  r	   r   r   r
   r
   r   r     s    zCharacterData.__init__c                 C   s
   t | jS r&   )r   rQ   r   r
   r
   r   r     s    zCharacterData._get_lengthc                 C   s   | j S r&   r<  r   r
   r
   r   	_get_data  s    zCharacterData._get_datac                 C   s
   || _ d S r&   r=  r   rQ   r
   r
   r   	_set_data  s    zCharacterData._set_datac                 C   s6   | j }t|dkrd}nd}d| jj|dd |f S )N
   z...r   z<DOM %s node "%r%s">r   )rQ   r   r  r|   )r   rQ   Z	dotdotdotr
   r
   r   r    s    zCharacterData.__repr__c                 C   sT   |dk rt jd|t| jkr.t jd|dk rBt jd| j|||  S Nr   offset cannot be negative#offset cannot be beyond end of datacount cannot be negativer7   r8   IndexSizeErrr   rQ   r   offsetcountr
   r
   r   substringData  s    zCharacterData.substringDatac                 C   s   | j | | _ d S r&   r4  )r   argr
   r
   r   
appendData  s    zCharacterData.appendDatac                 C   sZ   |dk rt jd|t| jkr.t jd|rVd| jd | || j|d  f | _d S )Nr   rC  rD  %s%s%srF  )r   rI  rL  r
   r
   r   
insertData!  s    zCharacterData.insertDatac                 C   sl   |dk rt jd|t| jkr.t jd|dk rBt jd|rh| jd | | j|| d   | _d S rB  rF  rH  r
   r
   r   
deleteData*  s    zCharacterData.deleteDatac                 C   sr   |dk rt jd|t| jkr.t jd|dk rBt jd|rnd| jd | || j|| d  f | _d S )Nr   rC  rD  rE  rN  rF  )r   rI  rJ  rL  r
   r
   r   replaceData4  s    zCharacterData.replaceDataN)r|   r}   r~   r   r   r   r   r>  r@  r   rQ   r   r  rK  rM  rO  rP  rQ  r
   r
   r
   r   r;    s   			
r;  zLength of the string data.c                   @   sH   e Zd ZdZejZdZdZdd Z	dddZ
d	d
 Zdd Zdd ZdS )r   r
   z#textNc                 C   s   |dk s|t | jkr"tjd|  }| j|d  |_| j|_| j}| jr~| | jj	v r~|d u rp| j
| n| j|| | jd | | _|S )Nr   zillegal offset value)r   rQ   r7   r8   rG  r  rY   rD   r;   r(   r=   r5   )r   rI  ZnewTextnextr
   r
   r   	splitTextI  s    zText.splitTextr   c                 C   s   t |d|| j|f  d S )NrN  )r   rQ   r:  r
   r
   r   r    X  s    zText.writexmlc                 C   s   | j g}| j}|d urB|jtjtjfv rB|d|j  |j}qqBq| j}|d urz|jtjtjfv rz||j  |j}qHqzqHd	|S )Nr   r   )
rQ   rE   r   r	   rP   r   rC   rD   rS   join)r   rV   r   r
   r
   r   _get_wholeText]  s    zText._get_wholeTextc                 C   s   | j }| j}|d ur@|jtjtjfv r@|j}|| |}qq@q| j}|sT||  |d ur|jtjtjfv r|j}|| |}qTqqT|r|| _| S d S d S r&   )	r;   rE   r   r	   rP   r   r<   rD   rQ   )r   Zcontentr   r   rR  r
   r
   r   replaceWholeTexto  s*    


zText.replaceWholeTextc                 C   sF   | j  rdS t| }|d u r"dS | j|}|d u r:dS | S d S r  )rQ   strip_get_containing_elementrY   r   isElementContent)r   r   r   r
   r
   r   !_get_isWhitespaceInElementContent  s    
z&Text._get_isWhitespaceInElementContent)r   r   r   )r|   r}   r~   r   r	   rP   r   r   r   rS  r    rU  rV  rZ  r
   r
   r
   r   r   B  s   
r   ZisWhitespaceInElementContentzKTrue iff this text node contains only whitespace and is in element content.Z	wholeTextz.The text of all logically-adjacent text nodes.c                 C   s*   | j }|d ur&|jtjkr|S |j }qd S r&   )r;   r   r	   rT   rI   rH   r
   r
   r   rX    s    rX  c                 C   s*   | j }|d ur&|jtjkr|S |j }qd S r&   )r;   r   r	   r   r[  r
   r
   r   r)    s    r)  c                   @   s(   e Zd ZejZdZdd ZdddZdS )	Commentz#commentc                 C   s   t |  || _d S r&   )r;  r   r<  r?  r
   r
   r   r     s    
zComment.__init__r   c                 C   s,   d| j v rtd|d|| j |f  d S )Nz--z%'--' is not allowed in a comment nodez%s<!--%s-->%s)rQ   r?   r   r:  r
   r
   r   r      s    
zComment.writexmlN)r   r   r   )	r|   r}   r~   r	   r   r   r   r   r    r
   r
   r
   r   r\    s   r\  c                   @   s$   e Zd ZdZejZdZdddZdS )CDATASectionr
   z#cdata-sectionr   c                 C   s,   | j ddkrtd|d| j   d S )Nz]]>r   z$']]>' not allowed in a CDATA sectionz<![CDATA[%s]]>)rQ   findr?   r   r:  r
   r
   r   r      s    zCDATASection.writexmlN)r   r   r   )	r|   r}   r~   r   r	   r   r   r   r    r
   r
   r
   r   r]    s   r]  c                   @   sz   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )ReadOnlySequentialNamedNodeMap_seqr
   c                 C   s
   || _ d S r&   r`  )r   seqr
   r
   r   r     s    z'ReadOnlySequentialNamedNodeMap.__init__c                 C   s
   t | jS r&   r   ra  r   r
   r
   r   r     s    z&ReadOnlySequentialNamedNodeMap.__len__c                 C   s
   t | jS r&   rc  r   r
   r
   r   r     s    z*ReadOnlySequentialNamedNodeMap._get_lengthc                 C   s"   | j D ]}|j|kr|  S qd S r&   )ra  r   r   r
   r
   r   r     s    

z+ReadOnlySequentialNamedNodeMap.getNamedItemc                 C   s,   | j D ] }|j|kr|j|kr|  S qd S r&   )ra  r   r   r   r
   r
   r   r     s    
z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc                 C   s4   t |tr| j| }n
| |}|d u r0t||S r&   )r   r4   r   r   rj   )r   Zname_or_tuplerI   r
   r
   r   r     s    

z*ReadOnlySequentialNamedNodeMap.__getitem__c                 C   s2   |dk rd S z| j | W S  ty,   Y d S 0 d S r,   )ra  r   r   r
   r
   r   r     s    z#ReadOnlySequentialNamedNodeMap.itemc                 C   s   t jdd S Nz"NamedNodeMap instance is read-onlyr7   r8   r*  r   r
   r
   r   r     s    z.ReadOnlySequentialNamedNodeMap.removeNamedItemc                 C   s   t jdd S rd  re  r   r
   r
   r   r     s    z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc                 C   s   t jdd S rd  re  r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.setNamedItemc                 C   s   t jdd S rd  re  r   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.setNamedItemNSc                 C   s   | j gS r&   r`  r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__getstate__c                 C   s   |d | _ d S r,   r`  r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__setstate__N)r
   )r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r_    s   
	r_  z&Number of entries in the NamedNodeMap.c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )

Identifiedz@Mix-in class that supports the publicId and systemId attributes.publicIdsystemIdc                 C   s   || _ || _d S r&   rg  )r   rh  ri  r
   r
   r   _identified_mixin_init  s    z!Identified._identified_mixin_initc                 C   s   | j S r&   )rh  r   r
   r
   r   _get_publicId  s    zIdentified._get_publicIdc                 C   s   | j S r&   )ri  r   r
   r
   r   _get_systemId  s    zIdentified._get_systemIdN)r|   r}   r~   r   r   rj  rk  rl  r
   r
   r
   r   rf    s
   rf  c                   @   sH   e Zd ZejZdZdZdZdZ	dZ
dd Zdd Zdd Zdd	d
ZdS )DocumentTypeNc                 C   s2   t  | _t  | _|r&t|\}}|| _| j| _d S r&   )r_  entities	notationsr  r   r   )r   r  r   r  r
   r
   r   r   "  s    zDocumentType.__init__c                 C   s   | j S r&   )internalSubsetr   r
   r
   r   _get_internalSubset*  s    z DocumentType._get_internalSubsetc                 C   s   | j d u rtd }| j|_| j|_tjjj}|rg |j_	g |j
_	| j
j	D ]2}t|j|j|j}|j
j	| |||| qH| jj	D ]N}t|j|j|j|j}|j|_|j|_|j|_|jj	| |||| q| || | |S d S d S r&   )rY   rm  r   r   r7   r8   UserDataHandlerNODE_CLONEDrn  ra  ro  Notationrh  ri  rS   rw   EntitynotationNameactualEncodingr   r`   )r   rZ   cloneru   r   notationeentityr
   r
   r   r[   -  s0    

zDocumentType.cloneNoder   c                 C   s   | d | | j | jr8| d|| j|| jf  n| jrR| d|| jf  | jd ur|| d | | j | d | d|  d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z []r   )r   r   rh  ri  rp  r:  r
   r
   r   r    H  s    



zDocumentType.writexml)r   r   r   )r|   r}   r~   r	   DOCUMENT_TYPE_NODEr   r   r   rh  ri  rp  r   rq  r[   r    r
   r
   r
   r   rm    s   rm  c                   @   sf   e Zd ZdZejZdZdZdZ	dZ
dd Zdd Zdd Zdd	 Zd
d Zdd Zdd Zdd ZdS )ru  Nc                 C   s$   || _ || _t | _| || d S r&   )r   rv  rx   r(   rj  )r   r   rh  ri  ry  r
   r
   r   r   _  s    zEntity.__init__c                 C   s   | j S r&   rw  r   r
   r
   r   _get_actualEncodinge  s    zEntity._get_actualEncodingc                 C   s   | j S r&   r   r   r
   r
   r   _get_encodingh  s    zEntity._get_encodingc                 C   s   | j S r&   r`   r   r
   r
   r   _get_versionk  s    zEntity._get_versionc                 C   s   t jdd S )Nz(cannot append children to an entity noder7   r8   r9   )r   rF   r
   r
   r   r=   n  s    zEntity.appendChildc                 C   s   t jdd S )Nz+cannot insert children below an entity noder  r/  r
   r
   r   r5   r  s    zEntity.insertBeforec                 C   s   t jdd S )Nz*cannot remove children from an entity noder  rO   r
   r
   r   r<   v  s    zEntity.removeChildc                 C   s   t jdd S )Nz)cannot replace children of an entity noder  r0  r
   r
   r   rM   z  s    zEntity.replaceChild)r|   r}   r~   r   r	   ZENTITY_NODEr   r   rw  r   r`   r   r  r  r  r=   r5   r<   rM   r
   r
   r
   r   ru  V  s   ru  c                   @   s   e Zd ZejZdZdd ZdS )rt  Nc                 C   s   || _ | || d S r&   )r   rj  )r   r   rh  ri  r
   r
   r   r     s    zNotation.__init__)r|   r}   r~   r	   r   r   r   r   r
   r
   r
   r   rt  ~  s   rt  c                   @   s<   e Zd Zg dZdd Zdd Zdd Zdd	 Zd
d ZdS )DOMImplementation))core1.0)r  2.0)r  N)r7   r  )r7   r  )r7   N)ls-loadz3.0)r  Nc                 C   s   |dkrd }|  |f| jv S r   )lower	_featuresr^   r
   r
   r   r]     s    zDOMImplementation.hasFeaturec           	      C   s   |r|j d urtjd|  }|d u o8|d u o8|d u  }|sP|rPtjd|rt|\}}|dkr||dkr|tjd|r|stjd|||}|r|	| |	| |r| |_ |_
||_| |_|S )Nz(doctype object owned by another DOM treezElement with no namer7   z$http://www.w3.org/XML/1998/namespacezillegal use of 'xml' prefixz(illegal use of prefix without namespaces)r;   r7   r8   WrongDocumentErr_create_documentZInvalidCharacterErrr  r   createElementNSr=   rY   doctyper\   )	r   r   r  r  r   Zadd_root_elementr   r  r+  r
   r
   r   createDocument  s>    

z DOMImplementation.createDocumentc                 C   s   t |}||_||_|S r&   )rm  rh  ri  )r   r  rh  ri  r  r
   r
   r   createDocumentType  s    z$DOMImplementation.createDocumentTypec                 C   s   |  |d r| S d S d S r&   )r]   rf   r
   r
   r   rg     s    zDOMImplementation.getInterfacec                 C   s   t  S r&   )Documentr   r
   r
   r   r    s    z"DOMImplementation._create_documentN)	r|   r}   r~   r  r]   r  r  rg   r  r
   r
   r
   r   r    s   
-r  c                   @   s\   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd ZdS )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  c                 C   s
   || _ d S r&   r  r   r
   r
   r   r     s    zElementInfo.__init__c                 C   s   t S r&   r   r   Zanamer
   r
   r   r     s    zElementInfo.getAttributeTypec                 C   s   t S r&   r  r   r
   r
   r   r     s    zElementInfo.getAttributeTypeNSc                 C   s   dS r  r
   r   r
   r
   r   rY    s    zElementInfo.isElementContentc                 C   s   dS )zQReturns true iff this element is declared to have an EMPTY
        content model.Fr
   r   r
   r
   r   isEmpty  s    zElementInfo.isEmptyc                 C   s   dS )z7Returns true iff the named attribute is a DTD-style ID.Fr
   r  r
   r
   r   r     s    zElementInfo.isIdc                 C   s   dS )z<Returns true iff the identified attribute is a DTD-style ID.Fr
   r   r
   r
   r   r     s    zElementInfo.isIdNSc                 C   s   | j S r&   r  r   r
   r
   r   r     s    zElementInfo.__getstate__c                 C   s
   || _ d S r&   r  r   r
   r
   r   r     s    zElementInfo.__setstate__N)r|   r}   r~   r   r   r   r   r   rY  r  r   r   r   r   r
   r
   r
   r   r    s   r  c                 C   s>   | j tjkr| j  d | _nt| r:| jj  d | j_d S r&   )r   r	   r   	_id_cacheclear_id_search_stackr   rY   r   r
   r
   r   rB      s    
rB   c                   @   sr  e Zd ZdZejejejejfZ	e
 ZejZdZdZdZdZd ZZdZdZdZdZdZdZdZdZdd Zdd	 Zd
d Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(d d! Z)d"d# Z*d$d% Z+d&d' Z,d(d) Z-d*d+ Z.d,d- Z/d.d/ Z0d0d1 Z1d2d3 Z2d4d5 Z3d6d7 Z4d8d9 Z5d:d; Z6d<d= Z7d>d? Z8d@dA Z9dBdC Z:dIdEdFZ;dGdH Z<dS )Jr  )
_elem_infor  r  r(   r  z	#documentNFr   c                 C   s$   d | _ t | _i | _i | _d | _d S r&   )r  rx   r(   r  r  r  r   r
   r
   r   r   #  s
    zDocument.__init__c                 C   s&   |j r|j |jf}n|j}| j|S r&   )r   r   r   r  r   )r   r+  rl   r
   r
   r   r   ,  s    zDocument._get_elem_infoc                 C   s   | j S r&   r~  r   r
   r
   r   r  3  s    zDocument._get_actualEncodingc                 C   s   | j S r&   )r  r   r
   r
   r   _get_doctype6  s    zDocument._get_doctypec                 C   s   | j S r&   )documentURIr   r
   r
   r   _get_documentURI9  s    zDocument._get_documentURIc                 C   s   | j S r&   r  r   r
   r
   r   r  <  s    zDocument._get_encodingc                 C   s   | j S r&   )errorHandlerr   r
   r
   r   _get_errorHandler?  s    zDocument._get_errorHandlerc                 C   s   | j S r&   )r   r   r
   r
   r   _get_standaloneB  s    zDocument._get_standalonec                 C   s   | j S r&   )strictErrorCheckingr   r
   r
   r   _get_strictErrorCheckingE  s    z!Document._get_strictErrorCheckingc                 C   s   | j S r&   r  r   r
   r
   r   r  H  s    zDocument._get_versionc                 C   sj   |j | jvr(tjdt|t| f |jd ur>|j| |j tj	kr^| 
 r^tjdt| |S )Nr1   z two document elements disallowed)r   r6   r7   r8   r9   r:   r;   r<   r	   rT   _get_documentElementr=   r   r
   r
   r   r=   K  s    
zDocument.appendChildc                 C   sT   z| j | W n ty,   tj Y n0 d  |_|_d |_| j	|u rPd | _	|S r&   )
r(   rN   r?   r7   r8   r@   rD   rE   r;   documentElementrO   r
   r
   r   r<   [  s    
zDocument.removeChildc                 C   s$   | j D ]}|jtjkr|  S qd S r&   )r(   r   r	   rT   r   r
   r
   r   r  g  s    
zDocument._get_documentElementc                 C   s(   | j d ur| j   d | _ t|  d S r&   )r  rR   r	   r   r
   r
   r   rR   l  s    

zDocument.unlinkc                 C   s   |sd S | j d d d }| j|_| j|_| j|_| jD ]n}t|||}|j|sVJ |j	| |j
tjkr~|jd u sJ n |j
tjkr|jd u sJ ||_||_q6| tjjj| | |S r&   )r\   r  r   r   r`   r(   rX   rY   re   rS   r   r	   r   r  r}  r  r;   rw   r7   r8   rr  rs  )r   rZ   rx  r   Z
childcloner
   r
   r   r[   r  s(    
zDocument.cloneNodec                 C   s   t  }| |_|S r&   )r   rY   )r   rp   r
   r
   r   createDocumentFragment  s    zDocument.createDocumentFragmentc                 C   s   t |}| |_|S r&   )r  rY   )r   r   rz  r
   r
   r   createElement  s    zDocument.createElementc                 C   s(   t |tstdt }||_| |_|S Nznode contents must be a string)r   r   r   r   rQ   rY   )r   rQ   tr
   r
   r   createTextNode  s    
zDocument.createTextNodec                 C   s(   t |tstdt }||_| |_|S r  )r   r   r   r]  rQ   rY   r   rQ   rH   r
   r
   r   createCDATASection  s    
zDocument.createCDATASectionc                 C   s   t |}| |_|S r&   )r\  rY   r  r
   r
   r   createComment  s    zDocument.createCommentc                 C   s   t ||}| |_|S r&   )r1  rY   )r   r3  rQ   pr
   r
   r   createProcessingInstruction  s    
z$Document.createProcessingInstructionc                 C   s   t |}| |_d|_|S r   )r   rY   r   )r   r   ar
   r
   r   createAttribute  s    zDocument.createAttributec                 C   s"   t |\}}t|||}| |_|S r&   )r  r  rY   )r   r   r  r   r   rz  r
   r
   r   r    s    zDocument.createElementNSc                 C   s*   t |\}}t||||}| |_d|_|S r   )r  r   rY   r   )r   r   r  r   r   r  r
   r
   r   createAttributeNS  s
    zDocument.createAttributeNSc                 C   s   t ||||}| |_|S r&   )ru  rY   )r   r   rh  ri  rv  rz  r
   r
   r   _create_entity  s    zDocument._create_entityc                 C   s   t |||}| |_|S r&   )rt  rY   )r   r   rh  ri  r   r
   r
   r   _create_notation  s    zDocument._create_notationc                 C   s  || j v r| j | S | js$| js$d S | j}|d u rB| jg}|| _n|sJd S d }|r| }|dd |jD  | |}|rB|j	
 D ]}|jr||j|jr|| j |j< |j|kr|}n|js qq||jr
|| j |j< |j|kr|}n|js> qq|jr|| j |j< |j|kr.|}q|jdkr qqn>|jr|j	
 D ]*}|jrT|| j |j< |j|krT|}qT|d urNqqN|S )Nc                 S   s   g | ]}|j tv r|qS r
   )r   rA   ).0rW   r
   r
   r   
<listcomp>  s   
z+Document.getElementById.<locals>.<listcomp>r2   )r  r  r   r  r  popextendr(   r   r   r   r   r   r   r   r   r   r   r   )r   r   stackresultrI   r   r
  r
   r
   r   getElementById  sZ    






zDocument.getElementByIdc                 C   s   t | |t S r&   r  r   r
   r
   r   r    s    zDocument.getElementsByTagNamec                 C   s   t | ||t S r&   r   r   r
   r
   r   r!    s    
zDocument.getElementsByTagNameNSc                 C   s   | j ||S r&   )r\   r]   r^   r
   r
   r   ra     s    zDocument.isSupportedc                 C   s>   |j tjkrtjdn|j tjkr2tjdt||| S )Nzcannot import document nodesz!cannot import document type nodes)r   r	   r   r7   r8   NotSupportedErrr}  rX   )r   rI   rZ   r
   r
   r   
importNode  s
    zDocument.importNoder   c           	      C   sx   g }|r| d| d |d ur<| d|r0dnd d |dd| d|  | jD ]}||||| q^d S )	Nz
encoding="r   zstandalone="ZyesZnoz<?xml version="1.0"  z?>)rS   r   rT  r(   r    )	r   r%   r#   r#  r$   r   r   ZdeclarationsrI   r
   r
   r   r      s    
zDocument.writexmlc                 C   sJ  |j | ur tjd| |j f |jtjtjfvr>tjd|t	krd|v r|
dd\}}|dkr|tjjkrtjdq|dkr|tjjkr|jtjkrtjdd }|}nd }d }|jtjkr|j}|d ur|j}|| nd }||_||_||_||_|jtjkr||_n*||_|d urF|| |rF|| |S )Nz?cannot rename nodes from other documents;
expected %s,
found %sz8renameNode() only applies to element and attribute nodesr   r2   r   zillegal use of 'xmlns' prefixz$illegal use of the 'xmlns' attribute)rY   r7   r8   r  r   r	   rT   r   r  r   r   r   r   r   r   r  r   r   r   r   r   r   r  r%  )r   r   r   r   r   r   r+  Zis_idr
   r
   r   
renameNode&  sb    






zDocument.renameNode)r   r   r   NN)=r|   r}   r~   r   r	   rT   r   r   r}  r6   r  r\   r   r   r   r   r   r;   rE   rD   rw  r   r   r`   r  r  r  r   r   r   r  r  r  r  r  r  r  r  r=   r<   r  rR   r[   r  r  r  r  r  r  r  r  r  r  r  r  r  r!  ra   r  r    r  r
   r
   r
   r   r    sl   	
:  
r  r  z#Top-level element of this document.c                 C   s  | j |rtjjj}n
tjjj}| jtj	kr|
| j| j}| j D ]0}||j|j|j ||j|j}|j|_qH|r| jD ]}t|||}|| qn| jtjkr| }|r| jD ]}t|||}|| qn| jtjkr|| j}n| jtjkr|| j}n| jtjkr>|| j | j}nz| jtj!kr\|"| j}n\| jtj#kr|$| j| j}d|_| j|_n,| jtj%kr| j |usJ tjjj}|j&'| j(| j)| j*}||_ |rg |j+_,g |j-_,| j-j,D ]F}	t.|	j|	j)|	j*}
||
_ |j-j,/|
 t0|	dr|	1||	|
 q| j+j,D ]b}t2|j|j)|j*|j3}|j4|_4|j5|_5|j6|_6||_ |j+j,/| t0|dr>|1||| q>ntj7dt8|  t0| dr| 1|| | |S )zo
    Clone a node and give it the new owner document.
    Called by Node.cloneNode and Document.importNode
    Trw   zCannot clone node %s)9rY   re   r7   r8   rr  rs  ZNODE_IMPORTEDr   r	   rT   r  r   r   r   r   r  r   r  r   r   r(   rX   r=   r3   r  rP   r  rQ   r   r  r   r  r3  r   r  r   r  r}  r\   r  r   rh  ri  rn  ra  ro  rt  rS   rr   rw   ru  rv  rw  r   r`   r  r:   )rI   rZ   ZnewOwnerDocumentru   rx  r
  r  rW   rH   r   ry  rz  r{  r
   r
   r   rX   _  s    




rX   c                 C   s,   |  dd}t|dkr|S d |d fS d S )Nr   r2      r   )r   r   )r  fieldsr
   r
   r   r    s    r  c                 C   s0   | |i |}|  \}}|| |  |S r&   )ZgetEventZ
expandNoder  )funcargskwargsZeventsZtoktypeZrootNoder
   r
   r   _do_pulldom_parse  s
    
r  c                 C   sH   |du r"|s"ddl m} || S ddl m} t|j| f||dS dS )z3Parse a file into a DOM by filename or file object.Nr   expatbuilderpulldom)parserbufsize)xml.domr  parser  r  )filer  r  r  r  r
   r
   r   r    s    

r  c                 C   sB   |du rddl m} || S ddl m} t|j| fd|iS dS )z&Parse a file into a DOM from a string.Nr   r  r  r  )r  r  parseStringr  r  )stringr  r  r  r
   r
   r   r    s    

r  c                 C   s@   | r:t | trt| } | D ]\}}tj||s d S qtjS r&   )r   r   r   Z_parse_feature_stringr  r\   r]   )Zfeaturesfvr
   r
   r   getDOMImplementation  s    

r  )NN)N)N)7r   r   r  r7   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r8   r	   rT   r   rA   ZdefpropertyrK   r   r   r   r   r   r   objectr   ZAttributeListr   r   r  r  r,  r1  r;  r   rX  r)  r\  r]  r_  rf  rm  ru  rt  r  r  rB   r  rX   r  r  r  r  r  r
   r
   r
   r   <module>   s    w
	y $
  )GU	><(	O*  UR



