3
tY]                @   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.6/xml/dom/minidom.py__bool__+   s    zNode.__bool__c             C   s   | j dd|S )N )toprettyxml)r   encodingr
   r
   r   toxml.   s    z
Node.toxml	
c             C   sx   |d krt j }nt jt j |ddd}| jtjkrH| j|d||| n| j|d|| |d krh|j S |j	 j 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 ]}| j|| qW |S |j | jkrXtjjdt	|t	| f |j
d k	rn|j
j| |d kr| j| ny| jj|}W n tk
r   tjj Y nX |j tkrt|  | jj|| ||_||_|r| j|d  }||_||_nd |_| |_
|S )Nz%s cannot be child of %sr(   )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 ]}| j| qW |S |j | jkrXtjjdt	|t	| f n|j t
krjt|  |jd k	r|j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}| j| | j||S |j | jkrPtjjdt	|t	| f ||kr\d S |j
d k	rr|j
j| y| jj|}W n tk
r   tj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 j| W n tk
r.   tj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_|j  q|r|d j|jkr|d }|j|j |_|j|_|jr||j_|j  q|j| q|j| |jtj	kr|j
  qW || j d d < d S )Nr(   r)   r)   r)   )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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   | j |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j D ]&\}\}}|d k	r|j||||| qW d S )Nr[   )hasattrlistr[   itemsZ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 ]}|j  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   | j   d S )N)rH   )r   Z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   rj   rH   rl   rn   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 }||_||_|j| | |_d S )Nr(   r)   )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
    

rx   c             C   s6   |r2|j ddj ddj ddj dd}| j| d	S )
zWrites datachars to writer.&z&amp;<z&lt;"z&quot;>z&gt;N)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|j| 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|j| t|||| qW |S )Nr   )r$   r   r	   rJ   rw   rr   rI   "_get_elements_by_tagName_ns_helper)r   ZnsURIrw   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)rk   r$   )r   r
   r
   r   __init__T  s    zDocumentFragment.__init__)ro   rp   rq   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_valuerr   _prefixr$   
_localNamerO   ownerElementNFc             C   s2   d | _ || _|| _|| _t | _| jjt  d S )N)r   r   rr   r   rk   r$   rI   Text)r   qNamerr   rw   rs   r
   r
   r   r   b  s    zAttr.__init__c             C   s.   y| j S  tk
r(   | j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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)
rr   r   r/   r0   NamespaceErrr   rw   r   r:   r   )r   rs   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 ]}|j  qZW | j
d d = d S )NFr(   )r   _attrsr   _attrsNSrr   rw   _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 |j|}|d kr@dS | jrV|j| j| jS |j| jS d S )NTF)	r   rO   r   _get_elem_inforr   isIdNSrw   isIdr   )r   ru   r   infor
   r
   r   	_get_isId  s    
zAttr._get_isIdc             C   s\   | j }| j}|d ks|d kr tS |j|}|d kr6tS | jrL|j| j| jS |j| jS d S )N)	rO   r   _no_typer   rr   getAttributeTypeNSrw   getAttributeTyper   )r   ru   r   r   r
   r
   r   _get_schemaType  s    
zAttr._get_schemaType)r   r   rr   r   r$   r   rO   r   ) ro   rp   rq   	__slots__r	   ATTRIBUTE_NODEr   r   r   r   rF   r   r.   r   r   rW   r   r   r   propertyr   r   r   r   r   r   r   r   rs   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<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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; 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 )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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 j D ]}|j|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 j D ]}|j|j|jf|jf qW |S )N)r   r   rI   rr   rw   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 j S )N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.keysc             C   s
   | j j S )N)r   r   )r   r
   r
   r   keysNS  s    zNamedNodeMap.keysNSc             C   s
   | j j S )N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.valuesNc             C   s   | j 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   | j |dkS )Nr   )r   )r   rX   r
   r
   r   __eq__  s    zNamedNodeMap.__eq__c             C   s   | j |dkS )Nr   )r   )r   rX   r
   r
   r   __ge__  s    zNamedNodeMap.__ge__c             C   s   | j |dkS )Nr   )r   )r   rX   r
   r
   r   __gt__  s    zNamedNodeMap.__gt__c             C   s   | j |dkS )Nr   )r   )r   rX   r
   r
   r   __le__  s    zNamedNodeMap.__le__c             C   s   | j |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|_| j| Y nX ||_n t |tsdt	d|}| j| 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   rr   rw   r
   r
   r   getNamedItemNS@  s    zNamedNodeMap.getNamedItemNSc             C   sX   | j |}|d k	rJt| j | j|j= | j|j|jf= t|drFd |_	|S t
jj d S )Nr   )r   r:   r   r   r   r   rr   rw   rd   r   r/   r0   r8   )r   r   nr
   r
   r   removeNamedItemF  s    



zNamedNodeMap.removeNamedItemc             C   sZ   | j ||}|d k	rLt| j | j|j|jf= | j|j= t|drHd |_	|S t
jj d S )Nr   )r   r:   r   r   rr   rw   r   r   rd   r   r/   r0   r8   )r   rr   rw   r   r
   r
   r   removeNamedItemNSR  s    


zNamedNodeMap.removeNamedItemNSc             C   st   t |ts&tjjdt|t| f | jj|j}|r@|j	  || 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   rr   rw   r   r   r:   )r   rA   ra   r
   r
   r   r   ^  s    

zNamedNodeMap.setNamedItemc             C   s
   | j |S )N)r   )r   rA   r
   r
   r   setNamedItemNSk  s    zNamedNodeMap.setNamedItemNSc             C   s   | | }t |j |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__)r   r   r   )N)!ro   rp   rq   __doc__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   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 )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__ro   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)r   r   )ro   rp   rq   r   r   r   r   r   r
   r
   r
   r   r     s
   r   c               @   s   e Zd ZdDZ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/d0 Z$d1d2 Z%d3d4 Z&d5d6 Z'dEd8d9Z(d:d; Z)d<d= Z*d>d? Z+d@dA Z,dBdC Z-dS )FElementrO   r3   r   r   rs   rr   r   r$   r   r   r<   r=   Nr   c             C   sB   d | _ | | _| _|| _|| _t | _d  | _| _d | _	d | _
d S )N)r3   r   r   rs   rr   rk   r$   r<   r=   r   r   )r   r   rr   rs   rw   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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 j D ]}|j  qW d | _ d | _tj|  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   rr   rw   r
   r
   r   getAttributeNS  s    
zElement.getAttributeNSc             C   sV   | j |}|d kr4t|}||_| j|_| 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 |\}}| j||}|d krHt||||}||_| j|_| j| n4||jkrf||_|jrft|  |j|kr|||_||_	d S )N)
_nssplitgetAttributeNodeNSr   r   rO   r   r   r:   rs   r   )r   rr   qualifiedNamer   rs   	localnamer   r
   r
   r   setAttributeNS  s    

zElement.setAttributeNSc             C   s   | j d krd S | j j|S )N)r   r   )r   Zattrnamer
   r
   r   r     s    
zElement.getAttributeNodec             C   s   | j d krd S | j j||fS )N)r   r   )r   rr   rw   r
   r
   r   r     s    
zElement.getAttributeNodeNSc             C   s   |j d | fkrtjjd| j  | jj|jd }|d k	rD| j| | j	j|j
|jfd }|d k	rt||k	rt| j| t| | ||k	r|S ||k	r|S d S )Nzattribute node already owned)r   r/   r0   ZInuseAttributeErrr   r   r   r   removeAttributeNoder   rr   rw   _set_attribute_node)r   r   Zold1Zold2r
   r
   r   r     s    


zElement.setAttributeNodec             C   sP   | j d krtjj y| j| }W n tk
r@   tjj Y nX | j| 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j y| j ||f }W n tk
rD   tjj Y nX | j| d S )N)r   r/   r0   r8   r]   r   )r   rr   rw   r   r
   r
   r   removeAttributeNS%  s    

zElement.removeAttributeNSc             C   s^   |d krt jj y| j|j  W n tk
r@   t jj Y nX t|  |j  | 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   rr   rw   r
   r
   r   hasAttributeNSB  s    
zElement.hasAttributeNSc             C   s   t | |t S )N)r   rk   )r   r   r
   r
   r   getElementsByTagNameG  s    zElement.getElementsByTagNamec             C   s   t | ||t S )N)r   rk   )r   rr   rw   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  |j |d | j  | j }t|j }x4|D ],}|j d|  t||| j |j d q.W | jr|j d t| jdkr| jd j	t
jkr| jd j|ddd n8|j | x"| jD ]}|j||| || qW |j | |j d| j|f  n|j d	|  d S )
Nrz   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   | j   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   | j |}| j| d S )N)r   setIdAttributeNode)r   r   idAttrr
   r
   r   setIdAttributex  s    
zElement.setIdAttributec             C   s   | j ||}| j| d S )N)r   r   )r   rr   rw   r  r
   r
   r   setIdAttributeNS|  s    zElement.setIdAttributeNSc             C   sl   |d ks| j |j r tjj t| d k	r6tjj |jshd|_|  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)rO   r3   r   r   rs   rr   r   r$   r   r   r<   r=   )r   r   r   ).ro   rp   rq   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     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|jf< | |_d S )N)r:   r   r   r   r   rr   rw   r   )elementr   r
   r
   r   r     s
    r   c               @   sf   e Zd ZdZf 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.
    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| 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| 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| 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| 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)ro   rp   rq   r   r   r   ZEmptyNodeListr$   rt   rv   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   |j 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	  rG   )r   r   r   )ro   rp   rq   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j|  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   ro   )r   rG   Z	dotdotdotr
   r
   r   r     s    zCharacterData.__repr__c             C   sT   |dk rt jjd|t| jkr.t jjd|dk rBt j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jd|t| jkr.t j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jd|t| jkr.t jjd|dk rBt j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jd|t| jkr.t jjd|dk rBt j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)r  rO   r3   r=   r<   )ro   rp   rq   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f 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   z#textNc             C   s   |dk s|t | jkr"tjjd| j }| j|d  |_| j|_| j}| jr~| | jj	kr~|d krp| jj
| n| j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@|jd|j  |j}qP qW | j}x4|d k	r|jtjtjfkr||j|j  |j}qNP qNW dj	|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}|j| |}qP qW | j}|sX|j|  x6|d k	r|jtjtjfkr|j}|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 j rdS t| }|d kr"dS | jj|}|d kr:dS |j 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   )ro   rp   rq   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 j|  || _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|j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   )	ro   rp   rq   r	   r   r   r   r   r   r
   r
   r
   r   r%    s   r%  c               @   s$   e Zd Zf ZejZdZdddZdS )CDATASectionz#cdata-sectionr   c             C   s,   | j jddkrtd|j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   )	ro   rp   rq   r   r	   r   r   r   r   r
   r
   r
   r   r&    s   r&  c               @   s|   e Zd ZdZf 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dd ZdS )ReadOnlySequentialNamedNodeMap_seqc             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)  rr   rw   )r   rr   rw   r   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc             C   s4   t |tr| j| }n
| j|}|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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jdd S )Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rr   rw   r
   r
   r   r     s    z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc             C   s   t j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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)  )ro   rp   rq   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 )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)r,  r-  )ro   rp   rq   r   r   r.  r/  r0  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   rs   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	j| |j||| qJW xZ| jj	D ]N}t|j|j|j|j}|j|_|j|_|j|_|jj	j| |j||| qW | j|| | |S d S d S )N)rO   r1  r   r   r/   r0   UserDataHandlerNODE_CLONEDr2  r)  r3  Notationr,  r-  rI   rj   EntitynotationNameactualEncodingr   rU   )r   rP   clonerg   r   notationeentityr
   r
   r   rQ     s.    

zDocumentType.cloneNoder   c             C   s   |j d |j | j | jr8|j d|| j|| jf  n| jrR|j d|| jf  | jd k	r||j d |j | j |j d |j d|  d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z []r|   )r~   r   r,  r-  r4  )r   r"   r    r   r!   r
   r
   r   r   /  s    



zDocumentType.writexml)r   r   r   )ro   rp   rq   r	   DOCUMENT_TYPE_NODEr   r   r   r,  r-  r4  r   r5  rQ   r   r
   r
   r
   r   r1    s   r1  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 )r9  Nc             C   s$   || _ || _t | _| j|| d S )N)r   r:  rk   r$   r.  )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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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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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)ro   rp   rq   r   r	   ZENTITY_NODEr   r   r;  r   rU   r   rB  rC  rD  r5   r-   r4   rD   r
   r
   r
   r   r9  =  s   r9  c               @   s   e Zd ZejZdZdd ZdS )r8  Nc             C   s   || _ | j|| d S )N)r   r.  )r   r   r,  r-  r
   r
   r   r   i  s    zNotation.__init__)ro   rp   rq   r	   r   r   r   r   r
   r
   r
   r   r8  e  s   r8  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core1.02.0Nr/   ls-load3.0c             C   s   |dkrd }|j  |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jd| j }|d ko8|d ko8|d k }| rR|rRtjjd|rt|\}}|dkr~|dkr~tjjd|r| rtjjd|j||}|r|j	| |j	| |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   rr   r   rP  ru   Zadd_root_elementrs   r   r  r
   r
   r   createDocument~  s4    




z DOMImplementation.createDocumentc             C   s   t |}||_||_|S )N)r1  r,  r-  )r   r   r,  r-  rP  r
   r
   r   createDocumentType  s    z$DOMImplementation.createDocumentTypec             C   s   | j |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   rN    s    z"DOMImplementation._create_document)rF  rG  )rF  rH  )rF  N)r/   rG  )r/   rH  )r/   N)rI  rJ  )rI  N)	ro   rp   rq   rL  rS   rQ  rR  rZ   rN  r
   r
   r
   r   rE  n  s   -rE  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 )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   rr   rw   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 )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   rU  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   rr   rw   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)r   )ro   rp   rq   r   r   r   r   r   r#  rV  r   r   r   r   r
   r
   r
   r   rT    s   rT  c             C   s>   | j tjkr| jj  d | _nt| r:| jjj  d | j_d S )N)r   r	   r   	_id_cacheclear_id_search_stackrx   rO   )rA   r
   r
   r   r:     s    
r:   c               @   sr  e Zd ZdMZ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.d0d1 Z/d2d3 Z0d4d5 Z1d6d7 Z2d8d9 Z3d:d; Z4d<d= Z5d>d? Z6d@dA Z7dBdC Z8dDdE Z9dFdG Z:dNdIdJZ;dKdL Z<dS )OrS  
_elem_inforP  rY  r$   rW  z	#documentNFr   c             C   s$   d | _ t | _i | _i | _d | _d S )N)rP  rk   r$   rZ  rW  rY  )r   r
   r
   r   r   
  s
    zDocument.__init__c             C   s&   |j r|j |jf}n|j}| jj|S )N)rr   rw   r   rZ  r   )r   r  r^   r
   r
   r   r     s    zDocument._get_elem_infoc             C   s   | j S )N)r;  )r   r
   r
   r   rB    s    zDocument._get_actualEncodingc             C   s   | j S )N)rP  )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   rC  #  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   rD  /  s    zDocument._get_versionc             C   sj   |j | jkr(tjjdt|t| f |jd k	r>|jj| |j tj	kr^| j
 r^tjjdtj| |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 j| W n tk
r.   tj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   rd  N  s    zDocument._get_documentElementc             C   s(   | j d k	r| j j  d | _ tj|  d S )N)rP  rH   r	   )r   r
   r
   r   rH   S  s    

zDocument.unlinkc             C   s   |sd S | j jd d d }| j|_| j|_| j|_xx| jD ]n}t|||}|jj|sXt	|jj
| |jtjkr|jd kst	n |jtjkr|jd kst	||_||_q8W | jtjjj| | |S )N)rR   rQ  r   r`  rU   r$   rN   rO   rY   AssertionErrorrI   r   r	   r   re  rA  rP  r3   rj   r/   r0   r6  r7  )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   rr   r   rs   rw   r>  r
   r
   r   rO    s    zDocument.createElementNSc             C   s*   t |\}}t||||}| |_d|_|S )Nr   )r   r   rO   r   )r   rr   r   rs   rw   ro  r
   r
   r   createAttributeNS  s
    zDocument.createAttributeNSc             C   s   t ||||}| |_|S )N)r9  rO   )r   r   r,  r-  r:  r>  r
   r
   r   _create_entity  s    zDocument._create_entityc             C   s   t |||}| |_|S )N)r8  rO   )r   r   r,  r-  r   r
   r
   r   _create_notation  s    zDocument._create_notationc             C   s  || j kr| j | S | jp| js$d S | j}|d krB| jg}|| _n|sJd S d }x>|r|j }|jdd |jD  | j|}|r@x|j	j
 D ]}|jr|j|j|jr|| j |j< |j|kr|}n|jsP q|j|jr
|| j |j< |j|k r|}n
|js:P q|jr|| j |j< |j|kr.|}q|jdkrP qW nB|jrx8|j	j
 D ]*}|jrT|| j |j< |j|krT|}qTW |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(   )rW  rZ  r   rY  re  popextendr$   r   r   r   rr   r   rw   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   rk   )r   r   r
   r
   r   r     s    zDocument.getElementsByTagNamec             C   s   t | ||t S )N)r   rk   )r   rr   rw   r
   r
   r   r     s    zDocument.getElementsByTagNameNSc             C   s   | j 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jdn|j tjkr2tjjdt||| S )Nzcannot import document nodesz!cannot import document type nodes)r   r	   r   r/   r0   NotSupportedErrrA  rN   )r   rA   rP   r
   r
   r   
importNode  s
    zDocument.importNoder   c             C   sN   |d kr|j d|  n|j d||f  x| jD ]}|j|||| 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jd| |j f |jtjtjfkr>tjjd|t	krd|kr|j
dd\}}|dkr|tjjkrtjjdq|dkr|tjjkr|jtjkrtjjdd }|}nd }d }|jtjkr|j}|d k	r|j}|j| nd }||_||_||_||_|jtjkr||_n*||_|d k	rF|j| |rF|j| |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   rM  r   r	   rJ   r   r{  r   r   r   r   r   r   r   rs   r   rr   r   r   r   r   r   )r   r   rr   r   rs   rw   r  Zis_idr
   r
   r   
renameNode  sR    



zDocument.renameNode)rZ  rP  rY  r$   rW  )r   r   r   N)=ro   rp   rq   r   r	   rJ   r   r   rA  r.   rE  rR   r   r   r   r   r   r3   r=   r<   r;  r   r`  rU   rb  r^  r\  r   r   r   rB  r[  r]  rC  r_  ra  rc  rD  r5   r4   rd  rH   rQ   rg  rh  rj  rk  rl  rn  rp  rO  rq  rr  rs  rz  r   r   rV   r|  r   r}  r
   r
   r
   r   rS    sh    	
:
rS  re  z#Top-level element of this document.c             C   s  | j j|rtjjj}n
tjjj}| jtj	kr|j
| j| j}x>| jj D ]0}|j|j|j|j |j|j|j}|j|_qJW |rx$| jD ]}t|||}|j| qW n"| jtjkr|j }|rx$| jD ]}t|||}|j| qW n| jtjkr|j| j}n| jtjkr*|j| j}n| jtjkrL|j| j | j}n| jtj!krj|j"| j}nd| jtj#kr|j$| j| j}d|_| j|_n4| jtj%kr| j |k	st&tjjj}|j'j(| j)| j*| j+}||_ |rg |j,_-g |j._-xR| j.j-D ]F}	t/|	j|	j*|	j+}
||
_ |j.j-j0|
 t1|	dr|	j2||	|
 qW x| j,j-D ]b}t3|j|j*|j+|j4}|j5|_5|j6|_6|j7|_7||_ |j,j-j0| t1|drR|j2||| qRW ntjj8dt9|  t1| dr| j2|| | |S )zo
    Clone a node and give it the new owner document.
    Called by Node.cloneNode and Document.importNode
    Trj   zCannot clone node %s):rO   rY   r/   r0   r6  r7  ZNODE_IMPORTEDr   r	   rJ   rO  rr   r   r   r   r   r   r   rw   r   r$   rN   r5   r+   rg  rF   rj  rG   r   rk  r   rn  r	  r   rl  r   rq  rA  rf  rR   rR  r   r,  r-  r2  r)  r3  r8  rI   rd   rj   r9  r:  r;  r   rU   r{  r2   )rA   rP   ZnewOwnerDocumentrg   r<  r   ro  rM   r@   r   r=  r>  r?  r
   r
   r   rN   A  s~    

rN   c             C   s,   | j 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,   | ||}|j  \}}|j| |j  |S )N)ZgetEventZ
expandNoderX  )funcargskwargsZeventsZtoktypeZrootNoder
   r
   r   _do_pulldom_parse  s
    

r  c             C   sJ   |dkr$| r$ddl m} |j| 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krddl m} |j| 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   sB   | r<t | trtj| } x"| D ]\}}tjj||sd S qW tjS )N)r   r   r   Z_parse_feature_stringrS  rR   rS   )Zfeaturesfvr
   r
   r   getDOMImplementation  s    

r  )NN)N)N)7r   r   r  r/   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r0   r	   rJ   r   r9   ZdefpropertyrB   rx   r   r   r   r   r   objectr   ZAttributeListr   r   r   r   r  r  r  r   r"  r  r%  r&  r(  r+  r1  r9  r8  rE  rT  r:   rS  rN   r   r  r  r  r  r
   r
   r
   r   <module>   s    v
	y $
 w)GU	><(	O*  PR



