B
    2*\                @   s  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.d/ d/ZG d0d1 d1eeZ G d2d3 d3eeZ!ee!d#d4d	 G d5d6 d6e!Z"ee"d7d8d	 ee"d9d:d	 d;d< Z#d=d> Z$G d?d@ d@e!Z%G dAdB dBe"Z&G dCdD dDeZ'ee'd#dEd	 G dFdG dGZ(G dHdI dIe(eeZ)G dJdK dKe(eZ*G dLdM dMe(eeZ+G dNdO dOe	Z,G dPdQ dQeZ-dRdS Z.G dTdU dUee
Z/ee/dVdWd	 dXdY Z0dZd[ Z1d\d] Z2ddd^d_Z3ded`daZ4dfdbdcZ5dS )g    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
   :C:\ALexclude\prg\programme\Python37\Lib\xml\dom\minidom.py__bool__+   s    zNode.__bool__c             C   s   |  dd|S )N )toprettyxml)r   encodingr
   r
   r   toxml.   s    z
Node.toxml	
c             C   sx   |d krt  }nt jt  |ddd}| jtjkrH| |d||| n| |d|| |d krh| S |	  S d S )Nxmlcharrefreplacer   )r   errorsnewliner   )
ioStringIOTextIOWrapperBytesIOnodeTyper	   DOCUMENT_NODEwritexmlgetvaluedetach)r   indentnewlr   writerr
   r
   r   r   1   s    

zNode.toprettyxmlc             C   s
   t | jS )N)bool
childNodes)r   r
   r
   r   hasChildNodesC   s    zNode.hasChildNodesc             C   s   | j S )N)r$   )r   r
   r
   r   _get_childNodesF   s    zNode._get_childNodesc             C   s   | j r| j d S d S )Nr   )r$   )r   r
   r
   r   _get_firstChildI   s    zNode._get_firstChildc             C   s   | j r| j d S d S )N)r$   )r   r
   r
   r   _get_lastChildM   s    zNode._get_lastChildc             C   s  |j | jkr0xt|jD ]}| || qW |S |j | jkrXtjdt	|t	| f |j
d k	rn|j
| |d kr| | ny| j|}W n tk
r   tj Y nX |j tkrt|  | j|| ||_||_|r| j|d  }||_||_nd |_| |_
|S )Nz%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cr6   noder
   r
   r   r-   Q   s6    

zNode.insertBeforec             C   s   |j | jkr.xt|jD ]}| | qW |S |j | jkrXtjdt	|t	| f n|j t
krjt|  |jd k	r|j| t| | d |_|S )Nz%s cannot be child of %s)r   r+   r,   r$   r5   r.   r/   r0   r1   r2   r9   r:   r3   r4   _append_childr<   )r   rA   r@   r
   r
   r   r5   q   s    


zNode.appendChildc             C   s  |j | jkr(|j}| | | ||S |j | jkrPtjdt	|t	| f ||kr\d S |j
d k	rr|j
| y| j|}W n tk
r   tj Y nX || j|< | |_
d |_
|j tks|j tkrt|  |j|_|j|_d |_d |_|jr||j_|jr||j_|S )Nz%s cannot be child of %s)r   r+   r<   r4   r-   r.   r/   r0   r1   r2   r3   r$   r6   r7   r8   r9   r:   r=   )r   r>   oldChildr?   r6   r
   r
   r   replaceChild   s<    




zNode.replaceChildc             C   s   y| j | W n tk
r.   tj Y nX |jd k	rD|j|j_|jd k	rX|j|j_d  |_|_|jt	krvt
|  d |_|S )N)r$   remover7   r/   r0   r8   r<   r=   r   r9   r:   r3   )r   rC   r
   r
   r   r4      s    




zNode.removeChildc             C   s   g }x| j D ]}|jtjkr|jsL|r2|j|d _|jrB|j|j_|  q|r|d j|jkr|d }|j|j |_|j|_|jr||j_|  q|| q|| |jtj	kr|
  qW || j d d < d S )Nr(   )r$   r   r	   	TEXT_NODEdatar<   r=   unlinkappendELEMENT_NODE	normalize)r   LchildrA   r
   r
   r   rK      s*    



zNode.normalizec             C   s   t | || jp| S )N)_clone_nodeownerDocument)r   deepr
   r
   r   	cloneNode   s    zNode.cloneNodec             C   s   | j j||S )N)rO   implementation
hasFeature)r   featureversionr
   r
   r   isSupported   s    zNode.isSupportedc             C   s   d S )Nr
   )r   r
   r
   r   _get_localName   s    zNode._get_localNamec             C   s   | |kS )Nr
   )r   otherr
   r
   r   
isSameNode   s    zNode.isSameNodec             C   s   |  |d r| S d S d S )N)rV   )r   rT   r
   r
   r   getInterface   s    zNode.getInterfacec          	   C   s,   y| j | d S  ttfk
r&   d S X d S )Nr   )
_user_dataAttributeErrorKeyError)r   keyr
   r
   r   getUserData   s    zNode.getUserDatac             C   sn   d }y
| j }W n tk
r,   i }|| _ Y nX ||krB|| d }|d kr^d }|d k	rj||= n||f||< |S )Nr   )r[   r\   )r   r^   rG   handlerolddr
   r
   r   setUserData   s    
zNode.setUserDatac             C   sH   t | drDx8t| j D ]&\}\}}|d k	r|||||| qW d S )Nr[   )hasattrlistr[   itemshandle)r   	operationsrcdstr^   rG   r`   r
   r
   r   _call_user_data_handler   s    
zNode._call_user_data_handlerc             C   sB   d  | _ | _| jr2x| jD ]}|  qW t | _d | _d | _d S )N)r3   rO   r$   rH   NodeListr=   r<   )r   rM   r
   r
   r   rH     s    zNode.unlinkc             C   s   | S )Nr
   )r   r
   r
   r   	__enter__  s    zNode.__enter__c             C   s   |    d S )N)rH   )r   etZevtbr
   r
   r   __exit__  s    zNode.__exit__)N)r   r   N)!__name__
__module____qualname__namespaceURIr3   rO   r<   r=   r   prefixr   r   r   r%   r&   r'   r)   r-   r5   rD   r4   rK   rQ   rV   rW   rY   rZ   r_   rc   rk   rH   rm   rp   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 )Nr(   )r$   r=   r<   rI   r3   )r   rA   r$   Zlastr
   r
   r   rB     s    
rB   c             C   s(   x"| d k	r"| j tjkrdS | j} qW dS )NTF)r   r	   r   r3   )rA   r
   r
   r   _in_document&  s
    

rz   c             C   s6   |r2| dd dd dd dd}| | d S )	N&z&amp;<z&lt;"z&quot;>z&gt;)replacewrite)r"   rG   r
   r
   r   _write_data.  s    r   c             C   sH   xB| j D ]8}|jtjkr4|dks*|j|kr4|| t||| qW |S )Nr   )r$   r   r	   rJ   tagNamerI   _get_elements_by_tagName_helper)parentnamercrA   r
   r
   r   r   5  s    
r   c             C   s\   xV| j D ]L}|jtjkr|dks*|j|krF|dks<|j|krF|| t|||| qW |S )Nr   )r$   r   r	   rJ   ry   rt   rI   "_get_elements_by_tagName_ns_helper)r   ZnsURIry   r   rA   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 )N)rl   r$   )r   r
   r
   r   __init__T  s    zDocumentFragment.__init__)rq   rr   rs   r	   r+   r   nodeName	nodeValue
attributesr3   rJ   rF   CDATA_SECTION_NODEENTITY_REFERENCE_NODEPROCESSING_INSTRUCTION_NODECOMMENT_NODENOTATION_NODEr.   r   r
   r
   r
   r   r   F  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_valuert   _prefixr$   
_localNamerO   ownerElementNFc             C   s2   d | _ || _|| _|| _t | _| jt  d S )N)r   r   rt   r   rl   r$   rI   Text)r   qNamert   ry   ru   r
   r
   r   r   b  s    zAttr.__init__c             C   s.   y| j S  tk
r(   | jddd S X d S )N:r*   r(   )r   r\   r   split)r   r
   r
   r   rW   o  s    zAttr._get_localNamec             C   s   | j S )N)	specified)r   r
   r
   r   _get_specifiedu  s    zAttr._get_specifiedc             C   s   | j S )N)r   )r   r
   r
   r   	_get_namex  s    zAttr._get_namec             C   s   || _ | jd k	rt| j d S )N)r   r   r:   )r   valuer
   r
   r   	_set_name{  s    
zAttr._set_namec             C   s   | j S )N)r   )r   r
   r
   r   
_get_value  s    zAttr._get_valuec             C   s6   || _ || jd _| jd k	r&t| j || jd _d S )Nr   )r   r$   rG   r   r:   )r   r   r
   r
   r   
_set_value  s
    

zAttr._set_valuec             C   s   | j S )N)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 kr<| j}nd|| jf }| jrZt| j || _	d S )Nxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
rt   r   r/   r0   NamespaceErrr   ry   r   r:   r   )r   ru   ZnsuriZnewNamer
   r
   r   _set_prefix  s    
zAttr._set_prefixc             C   sz   | j }|d k	rR|j| j= |j| j| jf= | jrRd| _| jd8  _| j j	d8  _	x| j
D ]}|  qZW | j
d d = d S )NFr*   )r   _attrsr   _attrsNSrt   ry   _is_id_magic_id_nodesrO   _magic_id_countr$   rH   )r   elemrM   r
   r
   r   rH     s    
zAttr.unlinkc             C   sf   | j r
dS | j}| j}|d ks&|d kr*dS ||}|d kr@dS | jrV|| j| jS || jS d S )NTF)	r   rO   r   _get_elem_infort   isIdNSry   isIdr   )r   rw   r   infor
   r
   r   	_get_isId  s    
zAttr._get_isIdc             C   s\   | j }| j}|d ks|d kr tS ||}|d kr6tS | jrL|| j| jS || jS d S )N)	rO   r   _no_typer   rt   getAttributeTypeNSry   getAttributeTyper   )r   rw   r   r   r
   r
   r   _get_schemaType  s    
zAttr._get_schemaType) rq   rr   rs   	__slots__r	   ATTRIBUTE_NODEr   r   r   r   rF   r   r.   r   r   rW   r   r   r   propertyr   r   r   r   r   r   r   r   ru   rH   r   r   r
   r
   r
   r   r   X  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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d9d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d/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdS ):NamedNodeMap)r   r   _ownerElementc             C   s   || _ || _|| _d S )N)r   r   r   )r   attrsZattrsNSr   r
   r
   r   r     s    zNamedNodeMap.__init__c             C   s
   t | jS )N)lenr   )r   r
   r
   r   _get_length  s    zNamedNodeMap._get_lengthc             C   s0   y| t | j |  S  tk
r*   d S X d S )N)re   r   keys
IndexError)r   r6   r
   r
   r   item  s    zNamedNodeMap.itemc             C   s.   g }x$| j  D ]}||j|jf qW |S )N)r   valuesrI   r   r   )r   rL   rA   r
   r
   r   rf     s    zNamedNodeMap.itemsc             C   s4   g }x*| j  D ]}||j|jf|jf qW |S )N)r   r   rI   rt   ry   r   )r   rL   rA   r
   r
   r   itemsNS  s    zNamedNodeMap.itemsNSc             C   s"   t |tr|| jkS || jkS d S )N)
isinstancestrr   r   )r   r^   r
   r
   r   __contains__  s    

zNamedNodeMap.__contains__c             C   s
   | j  S )N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.keysc             C   s
   | j  S )N)r   r   )r   r
   r
   r   keysNS  s    zNamedNodeMap.keysNSc             C   s
   | j  S )N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.valuesNc             C   s   | j ||S )N)r   get)r   r   r   r
   r
   r   r   
  s    zNamedNodeMap.getc             C   s:   | j t|dd krdS t| t|kt| t|k  S d S )Nr   r   )r   getattrid)r   rX   r
   r
   r   _cmp  s    zNamedNodeMap._cmpc             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __eq__  s    zNamedNodeMap.__eq__c             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __ge__  s    zNamedNodeMap.__ge__c             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __gt__  s    zNamedNodeMap.__gt__c             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __le__  s    zNamedNodeMap.__le__c             C   s   |  |dk S )Nr   )r   )r   rX   r
   r
   r   __lt__!  s    zNamedNodeMap.__lt__c             C   s"   t |tr| j| S | j| S d S )N)r   r,   r   r   )r   attname_or_tupler
   r
   r   __getitem__$  s    

zNamedNodeMap.__getitem__c             C   sv   t |trRy| j| }W n0 tk
rH   t|}| jj|_| | Y nX ||_n t |tsdt	d|}| | d S )Nz%value must be a string or Attr object)
r   r   r   r]   r   r   rO   setNamedItemr   	TypeError)r   attnamer   rA   r
   r
   r   __setitem__+  s    


zNamedNodeMap.__setitem__c             C   s$   y
| j | S  tk
r   d S X d S )N)r   r]   )r   r   r
   r
   r   getNamedItem:  s    
zNamedNodeMap.getNamedItemc             C   s(   y| j ||f S  tk
r"   d S X d S )N)r   r]   )r   rt   ry   r
   r
   r   getNamedItemNS@  s    zNamedNodeMap.getNamedItemNSc             C   sX   |  |}|d k	rJt| j | j|j= | j|j|jf= t|drFd |_	|S t
j d S )Nr   )r   r:   r   r   r   r   rt   ry   rd   r   r/   r0   r8   )r   r   nr
   r
   r   removeNamedItemF  s    



zNamedNodeMap.removeNamedItemc             C   sZ   |  ||}|d k	rLt| j | j|j|jf= | j|j= t|drHd |_	|S t
j d S )Nr   )r   r:   r   r   rt   ry   r   r   rd   r   r/   r0   r8   )r   rt   ry   r   r
   r
   r   removeNamedItemNSR  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 )Nz%s cannot be child of %s)r   r   r/   r0   r1   r2   r   r   r   rH   r   rt   ry   r   r   r:   )r   rA   ra   r
   r
   r   r   ^  s    

zNamedNodeMap.setNamedItemc             C   s
   |  |S )N)r   )r   rA   r
   r
   r   setNamedItemNSk  s    zNamedNodeMap.setNamedItemNSc             C   s   | | }t |j |  d S )N)r:   r   rH   )r   r   rA   r
   r
   r   __delitem__n  s    
zNamedNodeMap.__delitem__c             C   s   | j | j| jfS )N)r   r   r   )r   r
   r
   r   __getstate__s  s    zNamedNodeMap.__getstate__c             C   s   |\| _ | _| _d S )N)r   r   r   )r   stater
   r
   r   __setstate__v  s    zNamedNodeMap.__setstate__)N) rq   rr   rs   r   r   r   r   rf   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   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 )N)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__rq   r   )r   r
   r
   r   __repr__  s    
zTypeInfo.__repr__c             C   s   | j S )N)r   )r   r
   r
   r   r     s    zTypeInfo._get_namec             C   s   | j S )N)r   )r   r
   r
   r   _get_namespace  s    zTypeInfo._get_namespaceN)rq   rr   rs   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)rO   r3   r   r   ru   rt   r   r$   r   r   r<   r=   Nr   c             C   sB   d | _ | | _| _|| _|| _t | _d  | _| _d | _	d | _
d S )N)r3   r   r   ru   rt   rl   r$   r<   r=   r   r   )r   r   rt   ru   ry   r
   r
   r   r     s    
zElement.__init__c             C   s   | j d kri | _ i | _d S )N)r   r   )r   r
   r
   r   _ensure_attributes  s    
zElement._ensure_attributesc             C   s.   y| j S  tk
r(   | jddd S X d S )Nr   r*   r(   )r   r\   r   r   )r   r
   r
   r   rW     s    zElement._get_localNamec             C   s   | j S )N)r   )r   r
   r
   r   _get_tagName  s    zElement._get_tagNamec             C   sD   | j d k	r*xt| j  D ]}|  qW d | _ d | _t|  d S )N)r   re   r   rH   r   r	   )r   attrr
   r
   r   rH     s    
zElement.unlinkc             C   s4   | j d krdS y| j | jS  tk
r.   dS X d S )Nr   )r   r   r]   )r   r   r
   r
   r   getAttribute  s    
zElement.getAttributec             C   s8   | j d krdS y| j ||f jS  tk
r2   dS X d S )Nr   )r   r   r]   )r   rt   ry   r
   r
   r   getAttributeNS  s    
zElement.getAttributeNSc             C   sV   |  |}|d kr4t|}||_| j|_| | n||jkrR||_|jrRt|  d S )N)getAttributeNoder   r   rO   setAttributeNoder   r:   )r   r   r   r   r
   r
   r   setAttribute  s    

zElement.setAttributec             C   s   t |\}}| ||}|d krHt||||}||_| j|_| | n4||jkrf||_|jrft|  |j|kr|||_||_	d S )N)
_nssplitgetAttributeNodeNSr   r   rO   r   r   r:   ru   r   )r   rt   qualifiedNamer   ru   	localnamer   r
   r
   r   setAttributeNS  s    

zElement.setAttributeNSc             C   s   | j d krd S | j |S )N)r   r   )r   Zattrnamer
   r
   r   r     s    
zElement.getAttributeNodec             C   s   | j d krd S | j ||fS )N)r   r   )r   rt   ry   r
   r
   r   r     s    
zElement.getAttributeNodeNSc             C   s   |j d | fkrtjd|   | j|jd }|d k	rD| | | j	|j
|jfd }|d k	rt||k	rt| | t| | ||k	r|S ||k	r|S d S )Nzattribute node already owned)r   r/   r0   ZInuseAttributeErrr   r   r   r   removeAttributeNoder   rt   ry   _set_attribute_node)r   r   Zold1Zold2r
   r
   r   r     s    


zElement.setAttributeNodec             C   sP   | j d krtj y| j| }W n tk
r@   tj Y nX | | d S )N)r   r/   r0   r8   r   r]   r   )r   r   r   r
   r
   r   removeAttribute  s    

zElement.removeAttributec             C   sT   | j d krtj y| j ||f }W n tk
rD   tj Y nX | | d S )N)r   r/   r0   r8   r]   r   )r   rt   ry   r   r
   r
   r   removeAttributeNS%  s    

zElement.removeAttributeNSc             C   s^   |d krt j y| j|j  W n tk
r@   t j Y nX t|  |  | j|_d S )N)	r/   r0   r8   r   r   r]   r:   rH   rO   )r   rA   r
   r
   r   r   .  s    
zElement.removeAttributeNodec             C   s   | j d krdS || j kS )NF)r   )r   r   r
   r
   r   hasAttribute=  s    
zElement.hasAttributec             C   s   | j d krdS ||f| j kS )NF)r   )r   rt   ry   r
   r
   r   hasAttributeNSB  s    
zElement.hasAttributeNSc             C   s   t | |t S )N)r   rl   )r   r   r
   r
   r   getElementsByTagNameG  s    zElement.getElementsByTagNamec             C   s   t | ||t S )N)r   rl   )r   rt   ry   r
   r
   r   getElementsByTagNameNSJ  s    zElement.getElementsByTagNameNSc             C   s   d| j t| f S )Nz<DOM Element: %s at %#x>)r   r   )r   r
   r
   r   r   N  s    zElement.__repr__r   c       	      C   s  | |d | j  |  }t| }x4|D ],}| d|  t||| j | d q.W | jr| d t| jdkr| jd j	t
jkr| jd |ddd n8| | x"| jD ]}|||| || qW | | | d| j|f  n| d	|  d S )
Nr|   z %s="r}   r~   r*   r   r   z</%s>%sz/>%s)r   r   _get_attributessortedr   r   r   r$   r   r   r	   rF   r   )	r   r"   r    	addindentr!   r   Za_namesZa_namerA   r
   r
   r   r   Q  s$    



zElement.writexmlc             C   s   |    t| j| j| S )N)r   r   r   r   )r   r
   r
   r   r   l  s    zElement._get_attributesc             C   s   | j r
dS dS d S )NTF)r   )r   r
   r
   r   hasAttributesp  s    zElement.hasAttributesc             C   s   |  |}| | d S )N)r   setIdAttributeNode)r   r   idAttrr
   r
   r   setIdAttributex  s    
zElement.setIdAttributec             C   s   |  ||}| | d S )N)r   r  )r   rt   ry   r  r
   r
   r   setIdAttributeNS|  s    zElement.setIdAttributeNSc             C   sj   |d ks|  |jstj t| d k	r4tj |jsfd|_|  jd7  _| j	 j
d7  _
t|  d S )NTr*   )rY   r   r/   r0   r8   _get_containing_entrefNoModificationAllowedErrr   r   rO   r   r:   )r   r  r
   r
   r   r    s    

zElement.setIdAttributeNode)r   r   r   ).rq   rr   rs   r   r	   rJ   r   r   r   r   r   r   r   rF   r   r   r.   r   r   r   rW   r   rH   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     sP   		
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 )N)r:   r   r   r   r   rt   ry   r   )elementr   r
   r
   r   r     s
    r   c               @   sb   e 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 )	Childlessr
   Nc             C   s   d S )Nr
   )r   r
   r
   r   r'     s    zChildless._get_firstChildc             C   s   d S )Nr
   )r   r
   r
   r   r)     s    zChildless._get_lastChildc             C   s   t j| jd d S )Nz nodes cannot have children)r/   r0   r1   r   )r   rA   r
   r
   r   r5     s    zChildless.appendChildc             C   s   dS )NFr
   )r   r
   r
   r   r%     s    zChildless.hasChildNodesc             C   s   t j| jd d S )Nz nodes do not have children)r/   r0   r1   r   )r   r>   r?   r
   r
   r   r-     s    zChildless.insertBeforec             C   s   t j| jd d S )Nz nodes do not have children)r/   r0   r8   r   )r   rC   r
   r
   r   r4     s    zChildless.removeChildc             C   s   d S )Nr
   )r   r
   r
   r   rK     s    zChildless.normalizec             C   s   t j| jd d S )Nz nodes do not have children)r/   r0   r1   r   )r   r>   rC   r
   r
   r   rD     s    zChildless.replaceChild)rq   rr   rs   r   r   ZEmptyNodeListr$   rv   rx   r'   r)   r5   r%   r-   r4   rK   rD   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)targetrG   c             C   s   || _ || _d S )N)r  rG   )r   r  rG   r
   r
   r   r     s    zProcessingInstruction.__init__c             C   s   | j S )N)rG   )r   r
   r
   r   _get_nodeValue  s    z$ProcessingInstruction._get_nodeValuec             C   s
   || _ d S )N)rG   )r   r   r
   r
   r   _set_nodeValue  s    z$ProcessingInstruction._set_nodeValuec             C   s   | j S )N)r  )r   r
   r
   r   _get_nodeName  s    z#ProcessingInstruction._get_nodeNamec             C   s
   || _ d S )N)r  )r   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   r  rG   )r   r"   r    r   r!   r
   r
   r   r     s    zProcessingInstruction.writexmlN)r   r   r   )rq   rr   rs   r	   r   r   r   r   r  r  r   r   r  r  r   r   r
   r
   r
   r   r
    s   

r
  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)_datarO   r3   r=   r<   c             C   s,   d  | _ | _d  | _| _d| _t|  d S )Nr   )rO   r3   r=   r<   r  r	   r   )r   r
   r
   r   r     s    zCharacterData.__init__c             C   s
   t | jS )N)r   rG   )r   r
   r
   r   r     s    zCharacterData._get_lengthc             C   s   | j S )N)r  )r   r
   r
   r   	_get_data  s    zCharacterData._get_datac             C   s
   || _ d S )N)r  )r   rG   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   )rG   r   r   rq   )r   rG   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   zoffset cannot be negativez#offset cannot be beyond end of datazcount cannot be negative)r/   r0   IndexSizeErrr   rG   )r   offsetcountr
   r
   r   substringData  s    zCharacterData.substringDatac             C   s   | j | | _ d S )N)rG   )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   zoffset cannot be negativez#offset cannot be beyond end of dataz%s%s%s)r/   r0   r  r   rG   )r   r  r  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 )Nr   zoffset cannot be negativez#offset cannot be beyond end of datazcount cannot be negative)r/   r0   r  r   rG   )r   r  r  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   zoffset cannot be negativez#offset cannot be beyond end of datazcount cannot be negativez%s%s%s)r/   r0   r  r   rG   )r   r  r  r  r
   r
   r   replaceData  s    zCharacterData.replaceDataN)rq   rr   rs   r   r   r   r   r  r  r   rG   r   r   r  r  r  r  r  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	kr~|d krp| j
| n| j|| | jd | | _|S )Nr   zillegal offset value)r   rG   r/   r0   r  r   rO   r<   r3   r$   r5   r-   )r   r  ZnewTextnextr
   r
   r   	splitText0  s    zText.splitTextr   c             C   s   t |d|| j|f  d S )Nz%s%s%s)r   rG   )r   r"   r    r   r!   r
   r
   r   r   ?  s    zText.writexmlc             C   s   | j g}| j}x6|d k	rD|jtjtjfkr@|d|j  |j}qP qW | j}x4|d k	r|jtjtjfkr|||j  |j}qNP qNW d	|S )Nr   r   )
rG   r=   r   r	   rF   r   r;   r<   rI   join)r   rL   r   r
   r
   r   _get_wholeTextD  s    

zText._get_wholeTextc             C   s   | j }| j}x6|d k	rB|jtjtjfkr>|j}|| |}qP qW | j}|sX||  x6|d k	r|jtjtjfkr|j}|| |}qZP qZW |r|| _| S d S d S )N)	r3   r=   r   r	   rF   r   r4   r<   rG   )r   Zcontentr   r   r  r
   r
   r   replaceWholeTextV  s*    




zText.replaceWholeTextc             C   sF   | j  rdS t| }|d kr"dS | j|}|d kr:dS | S d S )NF)rG   strip_get_containing_elementrO   r   isElementContent)r   r   r   r
   r
   r   !_get_isWhitespaceInElementContentr  s    
z&Text._get_isWhitespaceInElementContent)r   r   r   )rq   rr   rs   r   r	   rF   r   r   r   r  r   r!  r"  r&  r
   r
   r
   r   r   )  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 }x"|d k	r(|jtjkr |S |j }qW d S )N)r3   r   r	   rJ   )rA   r@   r
   r
   r   r$    s    

r$  c             C   s.   | j }x"|d k	r(|jtjkr |S |j }qW d S )N)r3   r   r	   r   )rA   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 )N)r  r   r  )r   rG   r
   r
   r   r     s    
zComment.__init__r   c             C   s,   d| j krtd|d|| j |f  d S )Nz--z%'--' is not allowed in a comment nodez%s<!--%s-->%s)rG   r7   r   )r   r"   r    r   r!   r
   r
   r   r     s    
zComment.writexmlN)r   r   r   )	rq   rr   rs   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]]>)rG   findr7   r   )r   r"   r    r   r!   r
   r
   r   r     s    zCDATASection.writexmlN)r   r   r   )	rq   rr   rs   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 )N)r+  )r   seqr
   r
   r   r     s    z'ReadOnlySequentialNamedNodeMap.__init__c             C   s
   t | jS )N)r   r+  )r   r
   r
   r   r     s    z&ReadOnlySequentialNamedNodeMap.__len__c             C   s
   t | jS )N)r   r+  )r   r
   r
   r   r     s    z*ReadOnlySequentialNamedNodeMap._get_lengthc             C   s"   x| j D ]}|j|kr|S qW d S )N)r+  r   )r   r   r   r
   r
   r   r     s    
z+ReadOnlySequentialNamedNodeMap.getNamedItemc             C   s,   x&| j D ]}|j|kr|j|kr|S qW d S )N)r+  rt   ry   )r   rt   ry   r   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc             C   s4   t |tr| j| }n
| |}|d kr0t||S )N)r   r,   r   r   r]   )r   Zname_or_tuplerA   r
   r
   r   r     s    

z*ReadOnlySequentialNamedNodeMap.__getitem__c             C   s0   |dk rd S y
| j | S  tk
r*   d S X d S )Nr   )r+  r   )r   r6   r
   r
   r   r     s    
z#ReadOnlySequentialNamedNodeMap.itemc             C   s   t jdd S )Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   r   r
   r
   r   r     s    z.ReadOnlySequentialNamedNodeMap.removeNamedItemc             C   s   t jdd S )Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rt   ry   r
   r
   r   r     s    z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc             C   s   t jdd S )Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rA   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.setNamedItemc             C   s   t jdd S )Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rA   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.setNamedItemNSc             C   s   | j gS )N)r+  )r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__getstate__c             C   s   |d | _ d S )Nr   )r+  )r   r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__setstate__N)r
   )rq   rr   rs   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d Zdd Zdd ZdS )	
Identified)publicIdsystemIdc             C   s   || _ || _d S )N)r.  r/  )r   r.  r/  r
   r
   r   _identified_mixin_init  s    z!Identified._identified_mixin_initc             C   s   | j S )N)r.  )r   r
   r
   r   _get_publicId  s    zIdentified._get_publicIdc             C   s   | j S )N)r/  )r   r
   r
   r   _get_systemId  s    zIdentified._get_systemIdN)rq   rr   rs   r   r0  r1  r2  r
   r
   r
   r   r-    s   r-  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 )N)r*  entities	notationsr   r   r   )r   r   ru   r   r
   r
   r   r   	  s    zDocumentType.__init__c             C   s   | j S )N)internalSubset)r   r
   r
   r   _get_internalSubset  s    z DocumentType._get_internalSubsetc             C   s   | j d krtd }| j|_| j|_tjjj}|rg |j_	g |j
_	x>| j
j	D ]2}t|j|j|j}|j
j	| |||| qJW xZ| jj	D ]N}t|j|j|j|j}|j|_|j|_|j|_|jj	| |||| qW | || | |S d S d S )N)rO   r3  r   r   r/   r0   UserDataHandlerNODE_CLONEDr4  r+  r5  Notationr.  r/  rI   rk   EntitynotationNameactualEncodingr   rU   )r   rP   clonerh   r   notationeentityr
   r
   r   rQ     s.    

zDocumentType.cloneNoder   c             C   s   | d | | j | jr8| d|| j|| jf  n| jrR| d|| jf  | jd k	r|| d | | j | d | d|  d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z []r~   )r   r   r.  r/  r6  )r   r"   r    r   r!   r
   r
   r   r   /  s    



zDocumentType.writexml)r   r   r   )rq   rr   rs   r	   DOCUMENT_TYPE_NODEr   r   r   r.  r/  r6  r   r7  rQ   r   r
   r
   r
   r   r3    s   r3  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 )r;  Nc             C   s$   || _ || _t | _| || d S )N)r   r<  rl   r$   r0  )r   r   r.  r/  r?  r
   r
   r   r   F  s    zEntity.__init__c             C   s   | j S )N)r=  )r   r
   r
   r   _get_actualEncodingL  s    zEntity._get_actualEncodingc             C   s   | j S )N)r   )r   r
   r
   r   _get_encodingO  s    zEntity._get_encodingc             C   s   | j S )N)rU   )r   r
   r
   r   _get_versionR  s    zEntity._get_versionc             C   s   t jdd S )Nz(cannot append children to an entity node)r/   r0   r1   )r   r>   r
   r
   r   r5   U  s    zEntity.appendChildc             C   s   t jdd S )Nz+cannot insert children below an entity node)r/   r0   r1   )r   r>   r?   r
   r
   r   r-   Y  s    zEntity.insertBeforec             C   s   t jdd S )Nz*cannot remove children from an entity node)r/   r0   r1   )r   rC   r
   r
   r   r4   ]  s    zEntity.removeChildc             C   s   t jdd S )Nz)cannot replace children of an entity node)r/   r0   r1   )r   r>   rC   r
   r
   r   rD   a  s    zEntity.replaceChild)rq   rr   rs   r   r	   ZENTITY_NODEr   r   r=  r   rU   r   rD  rE  rF  r5   r-   r4   rD   r
   r
   r
   r   r;  =  s   r;  c               @   s   e Zd ZejZdZdd ZdS )r:  Nc             C   s   || _ | || d S )N)r   r0  )r   r   r.  r/  r
   r
   r   r   i  s    zNotation.__init__)rq   rr   rs   r	   r   r   r   r   r
   r
   r
   r   r:  e  s   r:  c               @   sH   e Zd ZddddddddgZd	d
 Zdd Zdd Zdd Zdd ZdS )DOMImplementation)corez1.0)rH  z2.0)rH  N)r/   z1.0)r/   z2.0)r/   N)zls-loadz3.0)zls-loadNc             C   s   |dkrd }|  |f| jkS )Nr   )lower	_features)r   rT   rU   r
   r
   r   rS   y  s    zDOMImplementation.hasFeaturec       	      C   s   |r|j d k	rtjd|  }|d ko8|d ko8|d k }|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 namer/   z$http://www.w3.org/XML/1998/namespacezillegal use of 'xml' prefixz(illegal use of prefix without namespaces)r3   r/   r0   WrongDocumentErr_create_documentZInvalidCharacterErrr   r   createElementNSr5   rO   doctyperR   )	r   rt   r   rN  rw   Zadd_root_elementru   r   r  r
   r
   r   createDocument~  s4    


z DOMImplementation.createDocumentc             C   s   t |}||_||_|S )N)r3  r.  r/  )r   r   r.  r/  rN  r
   r
   r   createDocumentType  s    z$DOMImplementation.createDocumentTypec             C   s   |  |d r| S d S d S )N)rS   )r   rT   r
   r
   r   rZ     s    zDOMImplementation.getInterfacec             C   s   t  S )N)Document)r   r
   r
   r   rL    s    z"DOMImplementation._create_documentN)	rq   rr   rs   rJ  rS   rO  rP  rZ   rL  r
   r
   r
   r   rG  n  s   -rG  c               @   sX   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d ZdS )ElementInfo)r   c             C   s
   || _ d S )N)r   )r   r   r
   r
   r   r     s    zElementInfo.__init__c             C   s   t S )N)r   )r   anamer
   r
   r   r     s    zElementInfo.getAttributeTypec             C   s   t S )N)r   )r   rt   ry   r
   r
   r   r     s    zElementInfo.getAttributeTypeNSc             C   s   dS )NFr
   )r   r
   r
   r   r%    s    zElementInfo.isElementContentc             C   s   dS )NFr
   )r   r
   r
   r   isEmpty  s    zElementInfo.isEmptyc             C   s   dS )NFr
   )r   rS  r
   r
   r   r     s    zElementInfo.isIdc             C   s   dS )NFr
   )r   rt   ry   r
   r
   r   r     s    zElementInfo.isIdNSc             C   s   | j S )N)r   )r   r
   r
   r   r     s    zElementInfo.__getstate__c             C   s
   || _ d S )N)r   )r   r   r
   r
   r   r     s    zElementInfo.__setstate__N)rq   rr   rs   r   r   r   r   r%  rT  r   r   r   r   r
   r
   r
   r   rR    s   	rR  c             C   s>   | j tjkr| j  d | _nt| r:| jj  d | j_d S )N)r   r	   r   	_id_cacheclear_id_search_stackrz   rO   )rA   r
   r
   r   r:     s    
r:   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 )JrQ  )
_elem_inforN  rW  r$   rU  z	#documentNFr   c             C   s$   d | _ t | _i | _i | _d | _d S )N)rN  rl   r$   rX  rU  rW  )r   r
   r
   r   r   
  s
    zDocument.__init__c             C   s&   |j r|j |jf}n|j}| j|S )N)rt   ry   r   rX  r   )r   r  r^   r
   r
   r   r     s    zDocument._get_elem_infoc             C   s   | j S )N)r=  )r   r
   r
   r   rD    s    zDocument._get_actualEncodingc             C   s   | j S )N)rN  )r   r
   r
   r   _get_doctype  s    zDocument._get_doctypec             C   s   | j S )N)documentURI)r   r
   r
   r   _get_documentURI   s    zDocument._get_documentURIc             C   s   | j S )N)r   )r   r
   r
   r   rE  #  s    zDocument._get_encodingc             C   s   | j S )N)errorHandler)r   r
   r
   r   _get_errorHandler&  s    zDocument._get_errorHandlerc             C   s   | j S )N)
standalone)r   r
   r
   r   _get_standalone)  s    zDocument._get_standalonec             C   s   | j S )N)strictErrorChecking)r   r
   r
   r   _get_strictErrorChecking,  s    z!Document._get_strictErrorCheckingc             C   s   | j S )N)rU   )r   r
   r
   r   rF  /  s    zDocument._get_versionc             C   sj   |j | jkr(tjdt|t| f |jd k	r>|j| |j tj	kr^| 
 r^tjdt| |S )Nz%s cannot be child of %sz two document elements disallowed)r   r.   r/   r0   r1   r2   r3   r4   r	   rJ   _get_documentElementr5   )r   rA   r
   r
   r   r5   2  s    
zDocument.appendChildc             C   sV   y| j | W n tk
r.   tj Y nX d  |_|_d |_| j	|krRd | _	|S )N)
r$   rE   r7   r/   r0   r8   r<   r=   r3   documentElement)r   rC   r
   r
   r   r4   B  s    
zDocument.removeChildc             C   s$   x| j D ]}|jtjkr|S qW d S )N)r$   r   r	   rJ   )r   rA   r
   r
   r   rb  N  s    zDocument._get_documentElementc             C   s(   | j d k	r| j   d | _ t|  d S )N)rN  rH   r	   )r   r
   r
   r   rH   S  s    

zDocument.unlinkc             C   s   |sd S | j d d d }| j|_| j|_| j|_xL| jD ]B}t|||}|j| |jt	j
krbn|jt	jkrt||_||_q8W | tjjj| | |S )N)rR   rO  r   r^  rU   r$   rN   rI   r   r	   r   rC  rN  r3   rk   r/   r0   r8  r9  )r   rP   r>  r   Z
childcloner
   r
   r   rQ   Y  s"    
zDocument.cloneNodec             C   s   t  }| |_|S )N)r   rO   )r   rb   r
   r
   r   createDocumentFragmentn  s    zDocument.createDocumentFragmentc             C   s   t |}| |_|S )N)r   rO   )r   r   r@  r
   r
   r   createElements  s    zDocument.createElementc             C   s(   t |tstdt }||_| |_|S )Nznode contents must be a string)r   r   r   r   rG   rO   )r   rG   tr
   r
   r   createTextNodex  s    
zDocument.createTextNodec             C   s(   t |tstdt }||_| |_|S )Nznode contents must be a string)r   r   r   r(  rG   rO   )r   rG   r@   r
   r
   r   createCDATASection  s    
zDocument.createCDATASectionc             C   s   t |}| |_|S )N)r'  rO   )r   rG   r@   r
   r
   r   createComment  s    zDocument.createCommentc             C   s   t ||}| |_|S )N)r
  rO   )r   r  rG   pr
   r
   r   createProcessingInstruction  s    
z$Document.createProcessingInstructionc             C   s   t |}| |_d|_|S )Nr   )r   rO   r   )r   r   ar
   r
   r   createAttribute  s    zDocument.createAttributec             C   s"   t |\}}t|||}| |_|S )N)r   r   rO   )r   rt   r   ru   ry   r@  r
   r
   r   rM    s    zDocument.createElementNSc             C   s*   t |\}}t||||}| |_d|_|S )Nr   )r   r   rO   r   )r   rt   r   ru   ry   rl  r
   r
   r   createAttributeNS  s
    zDocument.createAttributeNSc             C   s   t ||||}| |_|S )N)r;  rO   )r   r   r.  r/  r<  r@  r
   r
   r   _create_entity  s    zDocument._create_entityc             C   s   t |||}| |_|S )N)r:  rO   )r   r   r.  r/  r   r
   r
   r   _create_notation  s    zDocument._create_notationc             C   s  || j kr| j | S | js$| js$d S | j}|d krB| jg}|| _n|sJd S d }x<|r| }|dd |jD  | |}|r>x|j	
 D ]}|jr||j|jr|| j |j< |j|kr|}n|jsP q||jr|| j |j< |j|kr|}n
|js8P q|jr|| j |j< |j|kr,|}q|jdkrP qW nB|jrx8|j	
 D ]*}|jrR|| j |j< |j|krR|}qRW |d k	rRP qRW |S )Nc             S   s   g | ]}|j tkr|qS r
   )r   r9   ).0rM   r
   r
   r   
<listcomp>  s    z+Document.getElementById.<locals>.<listcomp>r*   )rU  rX  r   rW  rc  popextendr$   r   r   r   rt   r   ry   r   r   r   r   r   )r   r   stackresultrA   r   r   r
   r
   r   getElementById  sZ    







zDocument.getElementByIdc             C   s   t | |t S )N)r   rl   )r   r   r
   r
   r   r     s    zDocument.getElementsByTagNamec             C   s   t | ||t S )N)r   rl   )r   rt   ry   r
   r
   r   r     s    zDocument.getElementsByTagNameNSc             C   s   | j ||S )N)rR   rS   )r   rT   rU   r
   r
   r   rV     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   r/   r0   NotSupportedErrrC  rN   )r   rA   rP   r
   r
   r   
importNode  s
    zDocument.importNoder   c             C   sN   |d kr| d|  n| d||f  x| jD ]}||||| q2W d S )Nz<?xml version="1.0" ?>z%<?xml version="1.0" encoding="%s"?>%s)r   r$   r   )r   r"   r    r   r!   r   rA   r
   r
   r   r     s    zDocument.writexmlc             C   sJ  |j | k	r tjd| |j f |jtjtjfkr>tjd|t	krd|k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 k	r|j}|| nd }||_||_||_||_|jtjkr||_n*||_|d k	rF|| |rF|| |S )Nz?cannot rename nodes from other documents;
expected %s,
found %sz8renameNode() only applies to element and attribute nodesr   r*   r   zillegal use of 'xmlns' prefixz$illegal use of the 'xmlns' attribute)rO   r/   r0   rK  r   r	   rJ   r   rx  r   r   r   r   r   r   r   ru   r   rt   r   r   r   r   r  )r   r   rt   r   ru   ry   r  Zis_idr
   r
   r   
renameNode  sR    



zDocument.renameNode)r   r   r   N)=rq   rr   rs   r   r	   rJ   r   r   rC  r.   rG  rR   r   r   r   r   r   r3   r=   r<   r=  r   r^  rU   r`  r\  rZ  r   r   r   rD  rY  r[  rE  r]  r_  ra  rF  r5   r4   rb  rH   rQ   rd  re  rg  rh  ri  rk  rm  rM  rn  ro  rp  rw  r   r   rV   ry  r   rz  r
   r
   r
   r   rQ    sf   	
:
rQ  rc  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}x>| j D ]0}||j|j|j ||j|j}|j|_qJW |rx$| jD ]}t|||}|| qW n| jtjkr| }|rx$| jD ]}t|||}|| qW n| jtjkr|| j}n| jtjkr*|| j}n| jtjkrL|| j | j}nr| jtj!krj|"| j}nT| jtj#kr|$| j| j}d|_| j|_n$| jtj%krtjjj}|j&'| j(| j)| j*}||_ |rg |j+_,g |j-_,xR| j-j,D ]F}	t.|	j|	j)|	j*}
||
_ |j-j,/|
 t0|	dr|	1||	|
 qW x| j+j,D ]b}t2|j|j)|j*|j3}|j4|_4|j5|_5|j6|_6||_ |j+j,/| t0|drB|1||| qBW ntj7dt8|  t0| dr| 1|| | |S )NTrk   zCannot clone node %s)9rO   rY   r/   r0   r8  r9  ZNODE_IMPORTEDr   r	   rJ   rM  rt   r   r   r   r   r   r   ry   r   r$   rN   r5   r+   rd  rF   rg  rG   r   rh  r   rk  r  r   ri  r   rn  rC  rR   rP  r   r.  r/  r4  r+  r5  r:  rI   rd   rk   r;  r<  r=  r   rU   rx  r2   )rA   rP   ZnewOwnerDocumentrh   r>  r   rl  rM   r@   r   r?  r@  rA  r
   r
   r   rN   A  s|    

rN   c             C   s,   |  dd}t|dkr|S d |d fS d S )Nr   r*      r   )r   r   )r   Zfieldsr
   r
   r   r     s    r   c             C   s,   | ||}|  \}}|| |  |S )N)ZgetEventZ
expandNoderV  )funcargskwargsZeventsZtoktypeZrootNoder
   r
   r   _do_pulldom_parse  s
    

r  c             C   sH   |d kr"|s"ddl m} || S ddl m} t|j| f||dS d S )Nr   )expatbuilder)pulldom)parserbufsize)xml.domr  parser  r  )filer  r  r  r  r
   r
   r   r    s    

r  c             C   sB   |d krddl m} || S ddl m} t|j| fd|iS d S )Nr   )r  )r  r  )r  r  parseStringr  r  )stringr  r  r  r
   r
   r   r    s    

r  c             C   sB   | r<t | trt| } x"| D ]\}}tj||sd S qW tjS )N)r   r   r   Z_parse_feature_stringrQ  rR   rS   )Zfeaturesfvr
   r
   r   getDOMImplementation  s    

r  )NN)N)N)6r   r  r/   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r0   r	   rJ   r   r9   ZdefpropertyrB   rz   r   r   r   r   r   objectr   ZAttributeListr   r   r   r   r	  r
  r  r   r$  r  r'  r(  r*  r-  r3  r;  r:  rG  rR  r:   rQ  rN   r   r  r  r  r  r
   r
   r
   r   <module>   s    v
	y $
 w)GU	><(	O*  PR



