def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Caratula caratula_em = xml_em.find('sii-dte:Caratula', namespaces=DTE_XMLNS_MAP) caratula_dict = _Caratula.parse_xml_to_dict(caratula_em) # XPath: /AEC/DocumentoAEC/Cesiones cesiones_em = xml_em.find('sii-dte:Cesiones', namespaces=DTE_XMLNS_MAP) # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido dte_cedido_em = cesiones_em.find('sii-dte:DTECedido', namespaces=DTE_XMLNS_MAP) dte_cedido_dict = _DteCedido.parse_xml_to_dict(dte_cedido_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion cesion_em_list: Sequence[XmlElement] = cesiones_em.findall( 'sii-dte:Cesion', namespaces=DTE_XMLNS_MAP, ) cesion_dict_list: Sequence[Mapping[str, object]] cesion_dict_list = [ _Cesion.parse_xml_to_dict(cesion_em) for cesion_em in cesion_em_list ] # XPath: /AEC/DocumentoAEC return dict( # id=xml_em.get('ID'), caratula=caratula_dict, cesiones_dte_cedido=dte_cedido_dict, cesiones_cesion=cesion_dict_list, )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: //Signature/KeyInfo key_info_em = xml_em.find('ds:KeyInfo', namespaces=xml_utils.XML_DSIG_NS_MAP) # XPath: //Signature/KeyInfo/X509Data key_info_x509_data_em = (key_info_em.find( 'ds:X509Data', namespaces=xml_utils.XML_DSIG_NS_MAP)) # XPath: //Signature return dict( # XPath: //Signature/SignatureValue signature_value=xml_em.findtext( 'ds:SignatureValue', namespaces=xml_utils.XML_DSIG_NS_MAP, ), # XPath: //Signature/KeyInfo/X509Data/X509Certificate key_info_x509_data_x509_cert=key_info_x509_data_em.findtext( 'ds:X509Certificate', namespaces=xml_utils.XML_DSIG_NS_MAP, ), )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente/RUTAutorizado return dict( rut=xml_em.findtext('sii-dte:RUT', namespaces=DTE_XMLNS_MAP), nombre=xml_em.findtext('sii-dte:Nombre', namespaces=DTE_XMLNS_MAP), )
def _remove_dte_xml_doc_personalizado(xml_doc: XmlElement) -> Tuple[XmlElement, bool]: # Remove non-standard but popular element 'DocPersonalizado', it if exists. modified = False em_path = 'sii-dte:DocPersonalizado' xml_em = xml_doc.getroottree().find(em_path, namespaces=DTE_XMLNS_MAP) if xml_em is not None: modified = True xml_doc.remove(xml_em) return xml_doc, modified
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cesionario return dict( rut=xml_em.findtext('sii-dte:RUT', namespaces=DTE_XMLNS_MAP), razon_social=xml_em.findtext('sii-dte:RazonSocial', namespaces=DTE_XMLNS_MAP), direccion=xml_em.findtext('sii-dte:Direccion', namespaces=DTE_XMLNS_MAP), email=xml_em.findtext('sii-dte:eMail', namespaces=DTE_XMLNS_MAP), )
def _set_dte_xml_missing_xmlns(xml_doc: XmlElement) -> Tuple[XmlElement, bool]: # source: name of the XML element without namespace. # cl_sii/data/ref/factura_electronica/schemas-xml/DTE_v10.xsd#L22 (f57a326) # cl_sii/data/ref/factura_electronica/schemas-xml/EnvioDTE_v10.xsd#L92 (f57a326) em_tag_simple = 'DTE' em_namespace = DTE_XMLNS em_tag_namespaced = '{%s}%s' % (em_namespace, em_tag_simple) # Tag of 'DTE' should be ... assert em_tag_namespaced == '{http://www.sii.cl/SiiDte}DTE' modified = False root_em = xml_doc.getroottree().getroot() root_em_tag = root_em.tag if root_em_tag == em_tag_namespaced: pass elif root_em_tag == em_tag_simple: modified = True root_em.set('xmlns', em_namespace) f = io.BytesIO() xml_utils.write_xml_doc(xml_doc, f) new_xml_doc_bytes = f.getvalue() xml_doc = xml_utils.parse_untrusted_xml(new_xml_doc_bytes) else: exc_msg = "XML root element tag does not match the expected simple or namespaced name." raise Exception(exc_msg, em_tag_simple, em_tag_namespaced, root_em_tag) return xml_doc, modified
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido/DocumentoDTECedido doc_dte_cedido_em = xml_em.find( 'sii-dte:DocumentoDTECedido', namespaces=DTE_XMLNS_MAP, ) # Signature over 'DocumentoDTECedido' # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido/Signature # signature_over_doc_dte_cedido_em = xml_em.find( # 'ds:Signature', # namespaces=xml_utils.XML_DSIG_NS_MAP, # ) # signature_over_doc_dte_cedido_dict = _XmlSignature.parse_xml_to_dict( # signature_over_doc_dte_cedido_em, # ) # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido/DocumentoDTECedido doc_dte_cedido_dict = _DocumentoDteCedido.parse_xml_to_dict( doc_dte_cedido_em) # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido return dict(documento_dte_cedido=doc_dte_cedido_dict, # signature=signature_over_doc_dte_cedido_dict, )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente/RUTAutorizado cedente_personas_autorizadas_em = xml_em.findall( 'sii-dte:RUTAutorizado', namespaces=DTE_XMLNS_MAP, ) cedente_persona_autorizada_dict_list = [ _RutAutorizado.parse_xml_to_dict(cedente_persona_autorizada) for cedente_persona_autorizada in cedente_personas_autorizadas_em ] # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente return dict( rut=xml_em.findtext('sii-dte:RUT', namespaces=DTE_XMLNS_MAP), razon_social=xml_em.findtext('sii-dte:RazonSocial', namespaces=DTE_XMLNS_MAP), direccion=xml_em.findtext('sii-dte:Direccion', namespaces=DTE_XMLNS_MAP), email=xml_em.findtext('sii-dte:eMail', namespaces=DTE_XMLNS_MAP), declaracion_jurada=xml_em.findtext( 'sii-dte:DeclaracionJurada', namespaces=DTE_XMLNS_MAP, ) or None, ruts_autorizados=cedente_persona_autorizada_dict_list, )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido/DocumentoDTECedido/DTE dte_em = xml_em.find('sii-dte:DTE', namespaces=DTE_XMLNS_MAP) # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido/DocumentoDTECedido return dict( # id=xml_em.get('ID'), dte=dte_em, # tmst_firma=xml_em.findtext('sii-dte:TmstFirma', namespaces=DTE_XMLNS_MAP), )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/IdDTE id_dte_em = xml_em.find('sii-dte:IdDTE', namespaces=DTE_XMLNS_MAP) id_dte_dict = _IdDte.parse_xml_to_dict(id_dte_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente cedente_em = xml_em.find('sii-dte:Cedente', namespaces=DTE_XMLNS_MAP) cedente_dict = _Cedente.parse_xml_to_dict(cedente_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cesionario cesionario_em = xml_em.find('sii-dte:Cesionario', namespaces=DTE_XMLNS_MAP) cesionario_dict = _Cesionario.parse_xml_to_dict(cesionario_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion return dict( # id=xml_em.get('ID'), seq_cesion=xml_em.findtext('sii-dte:SeqCesion', namespaces=DTE_XMLNS_MAP), id_dte=id_dte_dict, cedente=cedente_dict, cesionario=cesionario_dict, monto_cesion=xml_em.findtext('sii-dte:MontoCesion', namespaces=DTE_XMLNS_MAP), ultimo_vencimiento=xml_em.findtext( 'sii-dte:UltimoVencimiento', namespaces=DTE_XMLNS_MAP, ), tmst_cesion=xml_em.findtext('sii-dte:TmstCesion', namespaces=DTE_XMLNS_MAP), email_deudor=xml_em.findtext('sii-dte:eMailDeudor', namespaces=DTE_XMLNS_MAP) or None, )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/IdDTE return dict( rut_emisor=xml_em.findtext('sii-dte:RUTEmisor', namespaces=DTE_XMLNS_MAP), tipo_dte=xml_em.findtext('sii-dte:TipoDTE', namespaces=DTE_XMLNS_MAP), folio=xml_em.findtext('sii-dte:Folio', namespaces=DTE_XMLNS_MAP), fch_emis=xml_em.findtext('sii-dte:FchEmis', namespaces=DTE_XMLNS_MAP), rut_receptor=xml_em.findtext('sii-dte:RUTReceptor', namespaces=DTE_XMLNS_MAP), mnt_total=xml_em.findtext('sii-dte:MntTotal', namespaces=DTE_XMLNS_MAP), )
def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ Parse XML element and return a dictionary. """ # XPath: /AEC/DocumentoAEC/Caratula return dict( rut_cedente=xml_em.findtext('sii-dte:RutCedente', namespaces=DTE_XMLNS_MAP), rut_cesionario=xml_em.findtext('sii-dte:RutCesionario', namespaces=DTE_XMLNS_MAP), nmb_contacto=xml_em.findtext('sii-dte:NmbContacto', namespaces=DTE_XMLNS_MAP) or None, fono_contacto=xml_em.findtext('sii-dte:FonoContacto', namespaces=DTE_XMLNS_MAP) or None, mail_contacto=xml_em.findtext('sii-dte:MailContacto', namespaces=DTE_XMLNS_MAP) or None, tmst_firmaenvio=xml_em.findtext('sii-dte:TmstFirmaEnvio', namespaces=DTE_XMLNS_MAP), )