
    /$ZW                         d Z ddlmZ ddlZej        dk    reZeZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZ ddlmZmZmZmZmZmZmZ  ej        e          Z G d d	e          ZdS )
zSimple XML manipulation    )unicode_literalsN3   )
__author____copyright____license____version__)TYPE_MAPTYPE_MARSHAL_FNTYPE_UNMARSHAL_FNREVERSE_TYPE_MAPStructDateDecimalc                   H   e Zd ZdZdddddi dfdZd(dZd Zd Zd	 Zd)d
Z	e
j        dk    rd Znd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z	 	 d*dZd Zd Zd Zd Zd Zd Zd Ze
j        dk    reZnd Zd  Zd! Z  e!d"           Z"d+d#Z#d$ Z$	 	 d,d%Z%d& Z&d(d'Z'dS )-SimpleXMLElementz#Simple XML manipulation (simil PHP)NFc                    || _         d                    |                                          }t          j        d|z            | _        || _        || _        || _        |_	 t          j
        j                            |          | _        n #  t                              |            xY w| j        j        g| _        dS || _        || _        dS )z
        :param namespaces_map: How to map our namespace prefix to that given by the client;
          {prefix: received_prefix}
        |z	^(%s):.*$N)!_SimpleXMLElement__namespaces_mapjoinkeysrecompile_SimpleXMLElement__ns_rx_SimpleXMLElement__ns_SimpleXMLElement__prefix_SimpleXMLElement__jettyxmldomminidomparseString_SimpleXMLElement__documentlogerrordocumentElement_SimpleXMLElement__elements)	selftextelementsdocument	namespaceprefixnamespaces_mapjetty_rxs	            8/usr/lib/python3/dist-packages/pysimplesoap/simplexml.py__init__zSimpleXMLElement.__init__'   s     !/hh~**,,--z,"455 	"%'/"="=d"C"C		$#>?DOOO&DO&DOOOs   #)B B*Tc                     |r	| j         du r| j                            |          }nt          |t                    r3| j                            |          }|r|                    d|           nR| j        r+| j                            | j         | j        d|          }n | j                            | j         |          }|t          |t          j	        j
        j                  r3|                    | j                            |j                             n-|                    | j                            |                     | j                            |           t#          |g| j        | j         | j        | j        | j                  S )zAdding a child tag to a nodeFxmlns:Nr)   r*   r+   r,   r.   r-   )r   r"   createElement
isinstance
basestringsetAttributer   createElementNSr   r   r    CDATASectionappendChildcreateCDATASectiondatacreateTextNode_elementr   r   r   )r'   namer(   nselements        r0   	add_childzSimpleXMLElement.add_childA   s    	KTY%''o33D99GG "j)) K/77== 6(("555 K/99$)PTP]P]P]_c_cEdee/99$)TJJ$ <== J##DO$F$Fty$Q$QRRRR##DO$B$B4$H$HIII!!'***Y_i=,0
 
 
 	
    c                     |                     d          rt                              | ||           dS |                     ||           dS )z$Add text child tag node (short form)_N)
startswithobject__setattr__rD   )r'   tagr(   s      r0   rJ   zSimpleXMLElement.__setattr__`   sP    >># 	&tS$///// NN3%%%%%rE   c                 p    d | j         j        D             }|D ]}| j                             |           dS )z#Remove a child tag (non recursive!)c                 2    g | ]}|j         |j        k    |S  nodeTypeELEMENT_NODE.0_SimpleXMLElement__elements     r0   
<listcomp>z0SimpleXMLElement.__delattr__.<locals>.<listcomp>j   5     E E E) )Y-CCC CCCrE   N)r@   
childNodesremoveChild)r'   rK   r)   rC   s       r0   __delattr__zSimpleXMLElement.__delattr__h   s[    E Et}/G E E E 	/ 	/GM%%g....	/ 	/rE   c                 n    | j                             |          }| j                            |           dS )z Add an xml comment to this childN)r"   createCommentr@   r<   )r'   r>   comments      r0   add_commentzSimpleXMLElement.add_commento   s3    ///55!!'*****rE   c                 p    |s| j                             d          S | j                             d          S )z-Return the XML representation of the documentUTF-8)encoding)r"   toxmltoprettyxml)r'   filenameprettys      r0   as_xmlzSimpleXMLElement.as_xmlt   s:     	A?((111?...@@@rE   r   c                 4    | j                                         S ))Return the XML representation of this tagr@   ra   r'   s    r0   __repr__zSimpleXMLElement.__repr__|   s    =&&(((rE   c                 6    | j                             d          S )rg   r_   rh   ri   s    r0   rj   zSimpleXMLElement.__repr__   s     =&&w///rE   c                     | j         j        S )z Return the tag name of this node)r@   tagNameri   s    r0   get_namezSimpleXMLElement.get_name   s    }$$rE   c                     | j         j        S )z4Return the tag local name (prefix:name) of this node)r@   	localNameri   s    r0   get_local_namezSimpleXMLElement.get_local_name   s    }&&rE   c                     | j         j        S )z(Return the namespace prefix of this node)r@   r,   ri   s    r0   
get_prefixzSimpleXMLElement.get_prefix   s    }##rE   c                     | j         }|?|j        :	 |j        d|z           j        S # t          $ r
 |j        }Y nw xY w||j        6dS dS dS dS )z%Return the namespace uri for a prefixNzxmlns:%s)r@   
attributesvalueKeyError
parentNode)r'   rB   rC   s      r0   get_namespace_uriz"SimpleXMLElement.get_namespace_uri   s    -!g&8&D-)*r/:@@ - - -!,- !g&8&D&D&D!!&D&D!!s   ' ;;c                     | j         j        S )z(Return a dict of attributes for this tag)r@   ru   ri   s    r0   ru   zSimpleXMLElement.attributes   s     }''rE   c                    t          |t                    r3| j                            |          r| j        j        |         j        S dS t          |t                    r1t          | j        j                                                  |         S | j	        |         }t          |g| j        | j        | j        | j        | j                  S )z>Return xml tag attribute value or a slice of attributes (iter)r5   N)r7   r8   r@   hasAttributeru   rv   slicelistitemsr&   r   r"   r   r   r   r   )r'   itemrC   s      r0   __getitem__zSimpleXMLElement.__getitem__   s     dJ'' 	}))$// <}/5;;< <e$$ 	0668899$?? od+G#!)}l#4   rE   c                 <    | j                             ||           dS )z$Set an attribute value from a stringN)r@   r9   )r'   rA   rv   s      r0   add_attributezSimpleXMLElement.add_attribute   s     ""4/////rE   c                     t          |t                    r|                     ||           dS t          |t                    r0|                                D ]\  }}|                     ||           dS dS )zSet an attribute valueN)r7   r8   r   r}   r   )r'   r   rv   kvs        r0   __setitem__zSimpleXMLElement.__setitem__   s    dJ'' 	)tU+++++e$$ 	) ) )1""1a((((	) 	)) )rE   c                 :    | j                             |           dS )zRemove an attributeN)r@   removeAttributer'   r   s     r0   __delitem__zSimpleXMLElement.__delitem__   s    %%d+++++rE   c                 
   	 |r9t          | j        j        g| j        | j        | j        | j        | j                  S ||                                 S |r|                                 S d}t          |t                    r| j        |         g}|rE|sCt          |t          t          f          r|p|fD ]!}| j                            ||          }|r n"| j        r"|s | j                            | j        |          }|s| j                            |          }|s|rt#          d          dS t          || j        | j        | j        | j        | j                  S # t"          $ r}t#          d|d|d          d}~ww xY w)z;Search (even in child nodes) and return a child tag by namer5   NzNo elements foundzTag not found: z ())r   r"   r%   r   r   r   r   __iter__childrenr7   intr&   tupler~   r@   getElementsByTagNameNSgetElementsByTagNameAttributeError)	r'   rK   rB   r   rootr$   r)   ns_uries	            r0   __call__zSimpleXMLElement.__call__   s   /	F 	'"o=>!_"i=,#'#8    {}}& '}}&H#s## 2 OC01 ( (eT];;BLrf  F#}CCFCPPH y P P=??	3OO C===cBB  ()<===F#!)}l#46 6 6 6  	F 	F 	F .SSS!!!!DEEE	Fs/   :E E E )CE /-E 
F'E==Fc                 ,    |                      |          S )zShortcut for __call__)r   )r'   rK   s     r0   __getattr__zSimpleXMLElement.__getattr__   s    }}S!!!rE   c           	   #      K   	 | j         D ]3}t          |g| j        | j        | j        | j        | j                  V  4dS #   xY w)z#Iterate over xml tags at this levelr5   N)r&   r   r"   r   r   r   r   )r'   rT   s     r0   r   zSimpleXMLElement.__iter__   sw      
	!_ : :	&'[!_"i=,#'#8: : : : : : :: :	s   ;A Ac                 .    d | j         j        D             S )zList xml children tags namesc                 <    g | ]}|j         |j        k    |j        S rN   )rP   	TEXT_NODErm   )rS   nodes     r0   rU   z,SimpleXMLElement.__dir__.<locals>.<listcomp>  s2     4 4 4=DN22 222rE   )r@   rW   ri   s    r0   __dir__zSimpleXMLElement.__dir__  s(    4 4=+4 4 4 	4rE   c                     d | j         j        D             }|sdS t          || j        | j        | j        | j        | j                  S )z Return xml children tags elementc                 2    g | ]}|j         |j        k    |S rN   rO   rR   s     r0   rU   z-SimpleXMLElement.children.<locals>.<listcomp>  rV   rE   Nr5   )r@   rW   r   r"   r   r   r   r   )r'   r)   s     r0   r   zSimpleXMLElement.children  sj    E Et}/G E E E 	4_i=,0
 
 
 	
rE   c                 *    t          | j                  S )zReturn element count)lenr&   ri   s    r0   __len__zSimpleXMLElement.__len__!  s    4?###rE   c                 6    | j                             |          S )z4Search for a tag name in this element or child nodes)r@   r   r   s     r0   __contains__zSimpleXMLElement.__contains__%  s    }11$777rE   c                 |    d}| j         j        D ],}|j        |j        k    s|j        |j        k    r
||j        z   }-|S )z5Returns the unicode text nodes of the current element )r@   rW   rP   r   CDATA_SECTION_NODEr>   )r'   rcr   s      r0   __unicode__zSimpleXMLElement.__unicode__)  sJ    M, 	$ 	$D}..$-4CZ2Z2Z$)^	rE   c                 P    |                                                      d          S )Nzutf-8)r   encoderi   s    r0   __str__zSimpleXMLElement.__str__4  s"    ##%%,,W555rE   c                 D    t          |                                           S )z0Returns the integer value of the current element)r   r   ri   s    r0   __int__zSimpleXMLElement.__int__7  s    4<<>>"""rE   c                     	 t          |                                           S #  t          | j                                                  xY w)z.Returns the float value of the current element)floatr   
IndexErrorr@   ra   ri   s    r0   	__float__zSimpleXMLElement.__float__;  sB    	4(((	4T]0022333s	    # (Ac                     | j         d         S )Nr   )r&   ri   s    r0   <lambda>zSimpleXMLElement.<lambda>B  s    T_Q%7 rE   c           	         i } |             D ]}t          |                                          }d}d|                                                                v rY|d         dd         }  | d          d          D ]3}|d         |k    r%|}|d                             d	          d         } n4	 t          |t                    rB||         }	t          d
 |dd         D                       rt          |	t                    s|	g}	n|}	nF# t          f$ r7}
|d         p&|
                    |                                          }d|                                                                v r|d                             d	          d         }	 |dk    rkd |dd         D             d         }||                             d	          d         }d|v r|d|                    d                   }t          |         g}	nt          |         }	n5#  d}	Y n/xY w|dk    rd}	n#d|v rd}	n|rt          d|d          t           }	Y d}
~
nd}
~
ww xY wt          |	t                    rL|                    |g           }|                                p|}|	rgt          |	d         t                    sL|pg D ]E}|                    |	d         |          }|                    |                                           Fnt)          |	d                   dk    rf|D ]a}i }|                                pg D ]1}|                    |                    |	d         |                     2|                    |           bnY|pg D ]1}|                    |                    |	d         |                     2n!t          |	t.                    rg }i }|                                }t)          |	          dk    ot          |	d         t                    }|r
 |            pg D ]c}|r0|                    |                    |	d         |                     4|                    |                    |	d         |                     d|r|                    |           ||v r:t          ||                   }|                    |           t/          |          }nt/          |          }nt          |	t                    r-|                                }|o|                    |	|          }n|	|}nt1          |          s|	t           k    rt1          |          dk    rx	 t3          j        |	|	          }	|	t           k    rt1          |          }n |	t1          |                    }n0# t6          t          f$ r}
t7          d|d|
          d}
~
ww xY wd}|||<   |S )z;Convert to python values the current serialized xml elementNhrefr   T)r   multiRefidzxsi:typer4   c                      g | ]\  }}d |v 	|S 	arrayTyperN   rS   r   r   s      r0   rU   z/SimpleXMLElement.unmarshall.<locals>.<listcomp>_  s&    EEE#!AK14D4DA4D4D4DrE   r3   Arrayc                      g | ]\  }}d |v 	|S r   rN   r   s      r0   rU   z/SimpleXMLElement.unmarshall.<locals>.<listcomp>j  s'    )S)S)S!+QRBRBR!BRBRBRrE   r   [z http://www.w3.org/2001/XMLSchemazTag: z invalid (type not found)r   z: )strrq   ru   r   splitr7   dictanyr~   rw   ry   rs   indexr   	TypeError
setdefaultr   
unmarshallextendvaluesr   updateappendr   unicoder   get
ValueError)r'   typesstrictdr   rA   ref_name_typer   ref_nodefnr   r3   xsd_type
array_typerv   r   childtmp_dictparent_das_dict_tmps                         r0   r   zSimpleXMLElement.unmarshallD  sb    DFF x	 x	Dt**,,--D M**//1111F|ABB' /$
 ; ;  H~--'(0(<(B(B3(G(G(J .
%eT** tB EEaaaEEEFF "zZ\^bOcOc " TB<   WR)?)?@Q@Q)R)R!2!2!7!7!9!999#J/55c::1=H"#w..)S)StAAAw)S)S)STU)VJ'+J'7'='=c'B'B1'EH"h+34HX^^C5H5H4H+I"28"<!=BB!1(!;B"!@@@ BBU]] BB #)$$$$PQQQ B9< "d## D!T2..  ==??2d  FjA55 F"*.b 8 8#(#3#3BqE6#B#BX__%6%677778 "Q%jj1nn"& / /#%&*mmoo&; M ME$OOE,<,<RUF,K,KLLLLX....	/ #+.b F FU%5%5beV%D%DEEEEF B&& *!==??b''Q,B:beT+B+B&588::; F FE F		%"2"22a5&"A"ABBBBU%5%5beV%D%DEEEE %LL$$$199$==DKK&&&!$KKEE!%LLEEB%% !  ==?? DX%8%8V%D%D: EET]] !rSyyWT]]b5H5H
D.22r::99 %,DMMEE$&Bwt}}$5$5E&	2 D D D(j$$$)BCCCD !EAdGGsL   5ADIA8IA>HIH1II AV))W:WWc                    | j                             |          }|rj|                                d         }	 |                    || j        |                   }n-# t
          $ r  t                              d|z             Y nw xY w|S )zBReplace the defined namespace alias with tohse used by the client.r   zUnknown namespace alias %s)r   searchgroupsreplacer   rw   r#   warning)r'   rA   prefs      r0   
_update_nszSimpleXMLElement._update_ns  s    |""4(( 	A;;==#DA||D$*?*EFF A A A84?@@@@@As   !A 'BBc                    |                      |          }t          |t                    r|r|                     ||          p| }|                                D ]P\  }}	|sd}n-t          |d          r|j                            |          }nd}|                    ||	||           QdS t          |t                    rP|r|                     ||          p| }|sd}|D ],\  }}	t          | |                              ||	||           -dS t          |t                    r|                     ||          }|sd}|r|                    d           t          |          D ]t\  }
}|                    ||d||           t          |t                    r@t          |          dk    r-|
t          |          dz
  k     r|                     ||          }udS t          |t          j        j        j        t&          f          r|                     |||           dS ||                     ||           dS |t)          j                    v r9|                     ||          }|                    t(          |                    dS t-          j        t/          |          t0                    }|                     | ||          |           dS )zFAnalyze python value and add the serialized XML element using tag name)rB   F
namespacesN)add_commentsrB   zRepetitive array of:r   )r   r7   r   rD   r   hasattrr   r   marshallr   getattrr~   r]   	enumerater   r   r   r    r;   r8   r
   r   r   typer   )r'   rA   rv   rD   r   rB   add_children_nsr   r   r   itr   s                r0   r   zSimpleXMLElement.marshall  s    t$$eT"" /	3 =$.."."="=EE 	G 	G1& BBUL11 )--a00BB Bq!,2FFFF	G 	G u%% !	3=$.."."="=EE"  U U1d##,,QQS,TTTTU Ut$$ 	3
 NN4BN//E"  :!!"8999!%(( 8 81tQLRPPP a&& 83q66A::!c%jj1n:L:L NN4BN77E8 8  <jIJJ 	3NN42N.....]NN4BN'''''hmoo%%NN4BN//Ehuo..... !$T%[[#66BNN4ErN22222rE   c                 z    | j                             |j        d          }| j                            |           d S NT)r"   
importNoder@   r<   )r'   otherxs      r0   import_nodezSimpleXMLElement.import_node  s7    O&&u~t<<!!!$$$$$rE   c                 T    ddl m} |                    | j        ||rg nd          }|S )z.Generate the canonical version of the XML noder   )c14nN)unsuppressedPrefixes)r   r   Canonicalizer@   )r'   output	exclusiver   r   s        r0   
write_c14nzSimpleXMLElement.write_c14n  sG    v;D5NRR$   P P
rE   r   )NF)NNFFT)T)TFFT)(__name__
__module____qualname____doc__r1   rD   rJ   rY   r]   re   sysversionrj   rn   rq   rs   ry   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr@   r   r   r   r   r   rN   rE   r0   r   r   $   s       -- 4$Ru' ' ' '4
 
 
 
>& & &/ / /+ + +
A A A A {S	) 	) 	) 	)	0 	0 	0
% % %' ' '$ $ $- - -( ( (
  *0 0 0) ) ), , , @E2F 2F 2F 2Fh" " "  4 4 4
 
 
 $ $ $8 8 8   {S	6 	6 	6# # #4 4 4 x7788HC C C CJ	 	 	 BG+/53 53 53 53n% % %     rE   r   )r  
__future__r   r  r  r   r8   r   loggingr   timexml.dom.minidomr   r   r   r   r   r	   helpersr
   r   r   r   r   r   r   	getLoggerr   r#   rI   r   rN   rE   r0   <module>r     s8     ( ' ' ' ' ' 



;JG  				      A A A A A A A A A A A A= = = = = = = = = = = = = = = = = = g!!p p p p pv p p p p prE   