o
    
i10                     @  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#   \/home/ubuntu/.local/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)	huge_treer*   )parser)r*   booleanresultsASKSELECTz/No RDF result-bindings or boolean answer found!resultbindingr   namec                 S  s   g | ]	}t |d qS )r4   )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_etree	XMLParserr   	xml_etreeElementTreer%   findRESULTS_NS_ETr   r   __init__bindingstag	parseTermr   r5   appendfindallvarstextlowerstrip	askAnswer)r"   r   r   parser_encoding
source_strlxml_parsertree
xml_parserr.   r/   type_r2   rr3   r#   r#   r$   rE   ;   sT   

zXMLResult.__init__r    )r   r   r   r   )r&   r'   r(   rE   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)r\   languribnodezunknown binding type %r)	rG   rL   rD   r5   r   r   r   r   	TypeError)rW   rG   rL   r\   r]   retr#   r#   r$   rH      s"   rH   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.r2   r   c                 C  s   t | | d S r    )r   rE   )r"   r2   r#   r#   r$   rE      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 )Nr0   )SPARQLXMLWriterr2   typewrite_header	write_askrO   rK   write_results_headerrF   write_start_resultitemswrite_bindingwrite_end_resultclose)r"   rc   r*   re   writerbkeyvalr#   r#   r$   	serialize   s   


zXMLResultSerializer.serializeN)r2   r   r+   )rc   r   r*   rd   re   r   r   rf   )r&   r'   r(   r)   rE   ru   r#   r#   r#   r$   rb      s    
rb   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 )'rg   z1
    Python saxutils-based SPARQL XML Writer
    r+   outputr   r*   rd   c                 C  s^   t ||}|  |dt |dt |tdfdti i  || _|| _|| _	d| _
d S )Nr[   xmlsparqlF)r   startDocumentstartPrefixMappingSPARQL_XML_NAMESPACEr   startElementNSr   rq   _output	_encoding_results)r"   rw   r*   rq   r#   r#   r$   rE      s   

zSPARQLXMLWriter.__init__allvarsLSequence[Variable]r   rf   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   Nr4   r4   variable)rq   r}   r|   r   rangelenrd   endElementNS)r"   r   i	attr_valsattr_qnamesr#   r#   r$   ri      s   zSPARQLXMLWriter.write_headerrt   boolc                 C  sD   | j tdfdti i  | j t|  | j tdfd d S )Nr.   )rq   r}   r|   r   
charactersrd   rM   r   )r"   rt   r#   r#   r$   rj      s
   zSPARQLXMLWriter.write_askc                 C  $   | j tdfdti i  d| _d S )Nr/   T)rq   r}   r|   r   r   r"   r#   r#   r$   rk         
z$SPARQLXMLWriter.write_results_headerc                 C  r   )Nr2   T)rq   r}   r|   r   _resultStartedr   r#   r#   r$   rl      r   z"SPARQLXMLWriter.write_start_resultc                 C  s&   | j sJ | jtdfd d| _ d S )Nr2   F)r   rq   r   r|   r   r#   r#   r$   ro      s   

z SPARQLXMLWriter.write_end_resultr4   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   r4   r3   r^   r_   r]   zxml:lang)Nr\   r\   rZ   zUnsupported RDF term: %s)r   rd   rq   r}   r|   r   r;   r   r   r   r   r   languager   r\   	Exception)r"   r4   rt   r   r   r#   r#   r$   rn      sP   




zSPARQLXMLWriter.write_bindingc                 C  s8   | j r| jtdfd | jtdfd | j  d S )Nr/   ry   )r   rq   r   r|   endDocumentr   r#   r#   r$   rp   -  s   zSPARQLXMLWriter.closeNrv   )rw   r   r*   rd   )r   r   r   rf   )rt   r   r   rf   )r   rf   )r4   r   rt   r   r   rf   )r&   r'   r(   r)   rE   ri   rj   rk   rl   ro   rn   rp   r#   r#   r#   r$   rg      s    





6rg   )rW   rX   r   rY   )5r)   
__future__r   loggingxml.etree.ElementTreeetreerB   rA   ior   typingr   r   r   r   r   r	   r
   r   r   r   r   xml.domr   xml.sax.saxutilsr   xml.sax.xmlreaderr   rdflib.queryr   r   r   r   rdflib.termr   r   r   r   r   
lxml.etreer?   r>   ImportErrorr|   rD   	getLoggerr&   logr   r!   rH   rb   rg   r#   r#   r#   r$   <module>   s2    
4

H