o
    mi10                     @  sP  d Z ddlmZ ddlZddlm  mZ ddlm	Z	 ddl
mZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlm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& z
ddl'mZ( dZ)W n e*yv   dZ)Y nw dZ+de+ Z,e-e.Z/G dd deZ0G dd deZ1dddZ2G dd de Z3G dd dZ4dS )zA Parser for SPARQL results in XML:

http://www.w3.org/TR/rdf-sparql-XMLres/

Bits and pieces borrowed from:
http://projects.bigasterisk.com/sparqlhttp/

Authors: Drew Perttula, Gunnar Aastrand Grimnes
    )annotationsN)BytesIO)IOTYPE_CHECKINGAnyBinaryIODictOptionalSequenceTextIOTupleUnioncast)XML_NAMESPACE)XMLGenerator)AttributesNSImpl)ResultResultExceptionResultParserResultSerializer)BNode
IdentifierLiteralURIRefVariableTFz&http://www.w3.org/2005/sparql-results#z{%s}c                   @  s   e Zd ZdZddd	d
ZdS )XMLResultParserz#A Parser for SPARQL results in XML.Nsourcer   content_typeOptional[str]returnr   c                 C  s   t |S N)	XMLResult)selfr   r    r#   b/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/results/xmlresults.pyparse6   s   zXMLResultParser.parser    )r   r   r   r   r   r   )__name__
__module____qualname____doc__r%   r#   r#   r#   r$   r   2   s    r   c                   @  s   e Zd Zdd	ddZdS )
r!   Nr   r   r   r   c                 C  s  d }t |drtrt|tsJ d}| }t||}n	tr't|ts'J tr<t	j
d|d}ttjt	j||d}ntj
|d}tj||d}|td }|td }	|d ur^d	}
n|	d ured
}
ntdt| |
 |
d
krg | _|	D ].}|jt dkrqxi }|D ]}|jt dkrqt|d |t|d< q| j| qxdd |dttf D | _d S |j  dk| _d S )Nencodingutf-8T)Z	huge_treer*   )parser)r*   booleanresultsASKZSELECTz/No RDF result-bindings or boolean answer found!resultbindingr   namec                 S  s   g | ]	}t |d qS )r2   )r   get).0xr#   r#   r$   
<listcomp>s   s    z&XMLResult.__init__.<locals>.<listcomp>z./%shead/%svariabletrue) hasattrr   
isinstancer   readr   encoder   
FOUND_LXML
lxml_etreeZ	XMLParserr   	xml_etreeElementTreer%   findRESULTS_NS_ETr   r   __init__bindingstag	parseTermr   r3   appendfindallvarstextlowerstrip	askAnswer)r"   r   r   Zparser_encodingZ
source_strZlxml_parsertreeZ
xml_parserr-   r.   type_r0   rr1   r#   r#   r$   rB   ;   sT   

zXMLResult.__init__r    )r   r   r   r   )r&   r'   r(   rB   r#   r#   r#   r$   r!   :   s    r!   elementxml_etree.Elementr   Union[URIRef, Literal, BNode]c                 C  s   | j | j}}|td kr=|du rd}d}d}| ddr%t| d}n| dt dr4| dt }t|||d}|S |td krGt|S |td krQt|S td	|  )
zLrdflib object (Literal, URIRef, BNode) for the given
    elementtree elementliteralN datatypez{%s}lang)rU   languribnodezunknown binding type %r)	rD   rI   rA   r3   r   r   r   r   	TypeError)rP   rD   rI   rU   rV   retr#   r#   r$   rE      s"   rE   c                   @  s&   e Zd ZdZdddZddddZdS )XMLResultSerializerz*Serializes SPARQL results into XML format.r0   r   c                 C  s   t | | d S r    )r   rB   )r"   r0   r#   r#   r$   rB      s   zXMLResultSerializer.__init__r+   streamr   r*   strkwargsr   r   Nonec                 K  s   t ||}| jjdkr|g  || jj n)|| jj |  | jjD ]}|	  |
 D ]
\}}||| q1|  q'|  d S )Nr/   )SPARQLXMLWriterr0   typewrite_header	write_askrL   rH   write_results_headerrC   write_start_resultitemswrite_bindingwrite_end_resultclose)r"   r\   r*   r^   writerbkeyvalr#   r#   r$   	serialize   s   


zXMLResultSerializer.serializeN)r0   r   r+   )r\   r   r*   r]   r^   r   r   r_   )r&   r'   r(   r)   rB   rn   r#   r#   r#   r$   r[      s    
r[   c                   @  sb   e Zd ZdZd!d"ddZd#ddZd$ddZd%ddZd%ddZd%ddZ	d&ddZ
d%ddZd S )'r`   z1
    Python saxutils-based SPARQL XML Writer
    r+   outputr   r*   r]   c                 C  s^   t ||}|  |dt |dt |tdfdti i  || _|| _|| _	d| _
d S )NrT   xmlsparqlF)r   ZstartDocumentZstartPrefixMappingSPARQL_XML_NAMESPACEr   startElementNSr   rj   _output	_encoding_results)r"   rp   r*   rj   r#   r#   r$   rB      s   

zSPARQLXMLWriter.__init__allvarsLSequence[Variable]r   r_   c                 C  s   | j tdfdti i  tdt|D ]$}dt|| i}ddi}| j tdfdt|| | j tdfd q| j tdfd d S )Nheadr   Nr2   r2   variable)rj   rt   rs   r   rangelenr]   endElementNS)r"   rx   i	attr_valsattr_qnamesr#   r#   r$   rb      s   zSPARQLXMLWriter.write_headerrm   boolc                 C  sD   | j tdfdti i  | j t|  | j tdfd d S )Nr-   )rj   rt   rs   r   
charactersr]   rJ   r   )r"   rm   r#   r#   r$   rc      s
   zSPARQLXMLWriter.write_askc                 C  $   | j tdfdti i  d| _d S )Nr.   T)rj   rt   rs   r   rw   r"   r#   r#   r$   rd         
z$SPARQLXMLWriter.write_results_headerc                 C  r   )Nr0   T)rj   rt   rs   r   _resultStartedr   r#   r#   r$   re      r   z"SPARQLXMLWriter.write_start_resultc                 C  s&   | j sJ | jtdfd d| _ d S )Nr0   F)r   rj   r   rs   r   r#   r#   r$   rh      s   

z SPARQLXMLWriter.write_end_resultr2   r   r   c                 C  sh  | j sJ dt|i}ddi}| jtdfdt|| t|tr>| jtdfdti i  | j| | j	tdfd nkt|t
r`| jtdfdti i  | j| | j	tdfd nIt|tri }i }|jrz|j|tdf< d|tdf< n|jr|j|d< d	|d< | jtd
fd
t|| | j| | j	td
fd
 ntd| | j	tdfd d S )Nr{   r2   r1   rW   rX   rV   zxml:lang)NrU   rU   rS   zUnsupported RDF term: %s)r   r]   rj   rt   rs   r   r9   r   r   r   r   r   languager   rU   	Exception)r"   r2   rm   r   r   r#   r#   r$   rg      sP   




zSPARQLXMLWriter.write_bindingc                 C  s8   | j r| jtdfd | jtdfd | j  d S )Nr.   rr   )rw   rj   r   rs   ZendDocumentr   r#   r#   r$   ri   -  s   zSPARQLXMLWriter.closeNro   )rp   r   r*   r]   )rx   ry   r   r_   )rm   r   r   r_   )r   r_   )r2   r   rm   r   r   r_   )r&   r'   r(   r)   rB   rb   rc   rd   re   rh   rg   ri   r#   r#   r#   r$   r`      s    





6r`   )rP   rQ   r   rR   )5r)   
__future__r   loggingZxml.etree.ElementTreeetreer?   r>   ior   typingr   r   r   r   r   r	   r
   r   r   r   r   Zxml.domr   Zxml.sax.saxutilsr   Zxml.sax.xmlreaderr   Zrdflib.queryr   r   r   r   Zrdflib.termr   r   r   r   r   Z
lxml.etreer=   r<   ImportErrorrs   rA   	getLoggerr&   logr   r!   rE   r[   r`   r#   r#   r#   r$   <module>   s2    
4

H