|
Responder ![]() |
Página 12> |
Autor | |
RUGALB ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Asiduo ![]() ![]() Unido: 21/Julio/2006 Localización: Mexico Estado: Sin conexión Puntos: 432 |
![]() Enviado: 05/Agosto/2022 a las 20:52 |
Hola Compañeros, buenas tardes.
Necesito Extraer los datos de un fichero XML, con las etiquetas e información correspondiente, basandome en el ejemplo de Mihura que sugiere en este hilo: http://www.mvp-access.com/foro/topic86265_post519739.html intente trabajar en ello pero no mefunciona, quiza sea por la forma en que estan declaradas las etiquetas, en lugar de ser simplemente así; <etiqueta> el fichero que tengo las tiene así: <etiqueta:algo>. No logro hacerlo, alguien me puede dar un poco de luz al respecto por favor. Mi fichero es así: El XML es así: <?xml version="1.0" encoding="utf-8"?> <cfdi:Comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www." LugarExpedicion="0000" MetodoPago="PUE" TipoDeComprobante="I" Total="123" Moneda="MXN" Certificado="xxx" SubTotal="00.00" CondicionesDePago="Contado" NoCertificado="000000" FormaPago="03" Sello="XXXXXx" Fecha="2022-01-14T10:45:18" Folio="13" Serie="MM" Version="3.3" xmlns:cfdi="http://www....."> <cfdi:Emisor Rfc="AAAAAA" Nombre="XXXXX" RegimenFiscal="621"></cfdi:Emisor><cfdi:Receptor Rfc="XXXXXX" Nombre="XXXXX" UsoCFDI="G03"></cfdi:Receptor> <cfdi:Conceptos> <cfdi:Concepto ClaveProdServ="43212108" Cantidad="2" ClaveUnidad="H87" Unidad="pieza" Descripcion="Impresora Térmica de Ticket 58mm" ValorUnitario="500.00" Importe="1000.00"> <cfdi:Impuestos> <cfdi:Traslados><cfdi:Traslado Base="000.00" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="000.00"></cfdi:Traslado></cfdi:Traslados> </cfdi:Impuestos> </cfdi:Concepto> <cfdi:Concepto ClaveProdServ="43201830" Cantidad="1" ClaveUnidad="H87" Unidad="pieza" Descripcion="Disco de Estado Sólido SSD 120GB" ValorUnitario="650.00" Importe="650.00"> <cfdi:Impuestos> <cfdi:Traslados><cfdi:Traslado Base="650" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="000.00"></cfdi:Traslado></cfdi:Traslados> </cfdi:Impuestos> </cfdi:Concepto> <cfdi:Concepto ClaveProdServ="81111809" Cantidad="1" ClaveUnidad="E48" Unidad="servicio" Descripcion="Instalación de Software a Equipo de Cómputo" ValorUnitario="100.00" Importe="100.00"> <cfdi:Impuestos> <cfdi:Traslados><cfdi:Traslado Base="100.00" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="00.00"></cfdi:Traslado></cfdi:Traslados> </cfdi:Impuestos> </cfdi:Concepto> </cfdi:Conceptos> <cfdi:Impuestos TotalImpuestosTrasladados="0000.00"> <cfdi:Traslados><cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="000.36"></cfdi:Traslado></cfdi:Traslados> </cfdi:Impuestos> <cfdi:Complemento> <tfd:TimbreFiscalDigital xmlns:tfd="http://www....." xsi:schemaLocation="http://www.....xsd" Version="1.1" UUID="000000000" FechaTimbrado="2022-01-14T10:57:01" RfcProvCertif="AAAAAAAAAAA" SelloCFD="XXXXXX" NoCertificadoSAT="000000" SelloSAT="000" /> </cfdi:Complemento> </cfdi:Comprobante> Muy agradecido desde ya por sus comentarios. |
|
Saludos desde Toluca, Estado de Mexico "El pesimista se queja del viento, el optimista espera que cambie, el realista ajusta las velas"(William Ward)
|
|
![]() |
|
emiliove ![]() Administrador ![]() Unido: 16/Junio/2009 Localización: Mexico Estado: Sin conexión Puntos: 5670 |
![]() |
Como te decía tienes que mirar cada atributo y meterlos a una tabla, lo haces revisando nodo por nodo y extrayendo la información.
Como dice el Sr. Mihura primero bajas el xml en un Documento Dom y después revisas cada atributo de cada nodo. Necesitas todos los atributos o solo algunos, la factura tu la generaste, y quieres los datos que no tienes del timbrado o es de otro lado. Puede ser algo así: Private Sub Command() Dim oXml As MSXML2.DOMDocument60 Dim oNodes As IXMLDOMNodeList Dim oNode As IXMLDOMNode Dim i As Long Set oXml = New MSXML2.DOMDocument60 With oXml '.Load "C:\SISAdmon\Sistema Administrativo\CFD\2116ROEJ5804226HATimbrado.xml" .Load "tu Ruta con el archivo como lo de arriba" Set oNodes = .SelectNodes("//*") 'SelectSingleNode For Each oNode In oNodes Debug.Print oNode.nodeName For i = 0 To oNode.Attributes.length - 1 Debug.Print oNode.Attributes(i).nodeName; Tab(30); _ oNode.Attributes(i).NodeValue Next i Next oNode Set oNodes = Nothing End With Set oXml = Nothing End Sub Editado por emiliove - 05/Agosto/2022 a las 23:26 |
|
![]() |
|
RUGALB ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Asiduo ![]() ![]() Unido: 21/Julio/2006 Localización: Mexico Estado: Sin conexión Puntos: 432 |
![]() |
muchísimas gracias por contestar Emilio :)
El fichero XML se genera externamente ya timbrado, se requieren leer todos los datos para poder llevarlos a una tabla y trabajar con esa información. Estoy revisando el código que amablemente colocaste. |
|
Saludos desde Toluca, Estado de Mexico "El pesimista se queja del viento, el optimista espera que cambie, el realista ajusta las velas"(William Ward)
|
|
![]() |
|
anaaais ![]() Nuevo ![]() Unido: 10/Agosto/2022 Localización: sevilla Estado: Sin conexión Puntos: 4 |
![]() |
Hola compañero Solo tienes que implementar el objeto de "Microsoft XML Parser" (Microsoft.XMLDOM es el objeto COM de Microsoft XML Parser) y despues: 1. Carga el XML desde una ruta especificada. 2. Seleccione la etiqueta del archivo XML mediante SelectNodes o SelectSingleNode. 3. SelectNodes: selecciona una lista de nodos que coincidan con el patrón Xpath. 4. Recorre todos los nodos y para cada nodo obtenga los nodos secundarios, y luego recorra los nodos secundarios e imprímalos. Y así podrás realizar todos los procesos o tratamiento de datos que quieres. Un saludo Editado para eliminar una cita innecesaria al primer mensaje completo
Editado por xavi - 11/Agosto/2022 a las 10:32 |
|
![]() |
|
RUGALB ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Asiduo ![]() ![]() Unido: 21/Julio/2006 Localización: Mexico Estado: Sin conexión Puntos: 432 |
![]() |
Muchas Gracias Anaaais, El código que Emilio puso es bastante bueno, obtiene toda la informacion de un XML, lo que comentas acerca de SelectNodes o SelectSingleNode para obtener información de ciertos parametros es correcto, el problema al que me enfrentaba ciertamente es a volcar esta información en registros en una tabla (cada registro dependiendo cuantas veces existiera la etiqueta <Concepto>)
Estoy trabajando en ello, al terminar lo posteare aquí como la solución que elaboré para obtener lo que necesitaba :)
Editado por RUGALB - 11/Agosto/2022 a las 17:06 |
|
Saludos desde Toluca, Estado de Mexico "El pesimista se queja del viento, el optimista espera que cambie, el realista ajusta las velas"(William Ward)
|
|
![]() |
|
Bacterio ![]() Moderador ![]() ![]() Unido: 16/Octubre/2004 Localización: España Estado: Sin conexión Puntos: 2112 |
![]() |
Cuando tienes espacios de nombres como es tu caso, tendrás que especificarlos asignando la propiedad "SelectionNamespaces". Y luego usarlos en la cadena de búsqueda XPATH. Por ejemplo:
|
|
![]() |
|
xavi ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador ![]() ![]() Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: en línea Puntos: 14630 |
![]() |
Bacterio!
Dichosos los ojos....
|
|
![]() |
|
Bacterio ![]() Moderador ![]() ![]() Unido: 16/Octubre/2004 Localización: España Estado: Sin conexión Puntos: 2112 |
![]() |
![]() Pasaba por aquí y me atrajo el mensaje
|
|
![]() |
|
emiliove ![]() Administrador ![]() Unido: 16/Junio/2009 Localización: Mexico Estado: Sin conexión Puntos: 5670 |
![]() |
Ya que estas y para ti es mejor extraerlo con SelectSingleNodo o con Attributes.getNamedItem con Attributes.getNamedItem no necesitamos poner el espacio de nombre.
Saludos. |
|
![]() |
|
RUGALB ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Asiduo ![]() ![]() Unido: 21/Julio/2006 Localización: Mexico Estado: Sin conexión Puntos: 432 |
![]() |
Wow! Tanto Maestro aquí reunido
Como siempre me complico todo, lo he solucionado así y me funciona, se de antemano que tome el camino más dificil ![]()
Me llama la atención el Código que me hizo favor de colocar Bacterio para trabajar con los namespaces ![]() Lo voy a tratar de implementar y les cuento como me fue. Excelente día para todos
|
|
Saludos desde Toluca, Estado de Mexico "El pesimista se queja del viento, el optimista espera que cambie, el realista ajusta las velas"(William Ward)
|
|
![]() |
|
RUGALB ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Asiduo ![]() ![]() Unido: 21/Julio/2006 Localización: Mexico Estado: Sin conexión Puntos: 432 |
![]() |
Ya me puse a trabajar con el Código que amablemente proporciono Bacterio, aquí es donde me surge la duda...
Cada Nodo <cfdi:Concepto> tiene subnodos:
¿Como puedo Anidar esos valores en una sola linea para irlos pasando como registros a una tabla? y que obtenga esto: ![]() Gracias por su apoyo.
|
|
Saludos desde Toluca, Estado de Mexico "El pesimista se queja del viento, el optimista espera que cambie, el realista ajusta las velas"(William Ward)
|
|
![]() |
|
Bacterio ![]() Moderador ![]() ![]() Unido: 16/Octubre/2004 Localización: España Estado: Sin conexión Puntos: 2112 |
![]() |
Creo que te has complicado muchísimo. Te paso un ejemplo más estructurado
A ver por dónde empiezo ... 1.- No uses el método "selectNodes" para acceder a un nodo que no se repite. Utiliza el método "selectSingleNode". Hablo de Set ndComprobante = xmlDoc.selectSingleNode("/cfdi:Comprobante") 'También valdría xmlDoc.documentElement , en lugar de Set xListaNodoComprobante = oXml.selectNodes("/cfdi:Comprobante") For Each xNodoComprobante In xListaNodoComprobante ' ... Next Lo único que consigues es hacer el código más voluminoso, complicado e ineficiente con bucles anidados. 2.- Los métodos "selectNodes" y "selectSingleNode" también están disponibles para los nodos. Aprovecha la estructura jerárquica de XML. Cuando se ejecuta una línea como Set ndEmisor = ndComprobante.selectSingleNode("cfdi:Emisor") , la búsqueda se hace en el fragmento xml del nodo <cfdi:Comprobante> Si en lugar de la línea anterior ejecutas Set xListaNodoEmisor = oXml.selectSingleNode("/cfdi:Comprobante/cfdi:Emisor") , la búsqueda se hace en todo el XML. Eso lo hace mucho más ineficiente y lento. Además de que puede dar lugar a resultados inesperados. 3.- De nuevo llamo tu atención XML sobre la estructura jerárquica de XML. En la medida de lo posible, procesa el xml siguiendo la estructuración del mismo. Me refiero por ejemplo a acceso al nodo Emisor dentro del bucle principal en el que procesas conceptos. En lugar de Set xListaNodoEmisor = oXml.selectNodes("/cfdi:Comprobante/cfdi:Emisor") , sería más sencillo, rápido y cómodo hacerlo como en el nuevo ejemplo que he pasado. Set ndEmisor = ndComprobante.selectSingleNode("cfdi:Emisor") En general, si un nodo está en un nivel jerárquico superior a otro, lo normal es que se procese antes: el nodo contenedor antes que el contenido También sugiero hacer la asignación fuera del bucle de los <cfdi:conceptos>. ¿Para que asignar el mismo nodo una y otra vez en cada ciclo del bucle? 4.- Estructura de tabla(s) La información de los atributos de los nodos comprobante, emisor, receptor, complemento, ... es la misma para todo el xml. En el diseño de tabla que pareces tener, tienes un registro para cada concepto. Y en cada uno de esos registros repites la información de esos atributos. Si has decidido de forma consciente y deliberada "desnormalizar" no tengo ningún comentario que hacer. Pero si tu intención no era esa debo indicarte que necesitarás al menos dos tablas. Una para los datos del comprobante y los nodos que no se repiten (emisor, receptor, complemento, ...) y otra para los múltiples conceptos incluidos en el comprobante. En el nuevo ejemplo muestro como acceder a los nodos "cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado" al procesar un nodo "cfdi:Concepto" como preguntabas Creo que has escrito el código antes de analizar lo suficiente la información proporcionada y meditar sobre cómo aplicarla a la tarea a realizar. No es una crítica porque desconozco el tiempo del que dispones para hacer que esto funcione. Todos tenemos fechas que cumplir y no siempre podemos dedicar el tiempo suficiente a investigar y aprender. Te sugiero que compares el código que publicaste con el nuevo ejemplo para ver las diferencias. Ten presente que cada maestrillo tiene su librillo como decimos aquí. Lo que te he mostrado es la forma en que a mí me gusta tratar con los XML's. Otra persona podría sugerir que simplifiques y sustituyas las cadenas "<cfdi:" por "<" y "</cfdi:" por "</". De ese modo podrías olvidarte de los espacios de nombre y el acceso a los nodos sería más sencillo. |
|
![]() |
|
Bacterio ![]() Moderador ![]() ![]() Unido: 16/Octubre/2004 Localización: España Estado: Sin conexión Puntos: 2112 |
![]() |
Esta sería la salida para el xml que pusiste de ejemplo en el mensaje inicial:
Procesando comprobante con fecha y hora 14/01/2022 10:45:18 Comprobante_xmlns_xsi http://www.w3.org/2001/XMLSchema-instance Comprobante_xsi_schemaLocation http://www. Comprobante_LugarExpedicion 0000 Comprobante_MetodoPago PUE Comprobante_TipoDeComprobante I Comprobante_Total 123 Comprobante_Moneda MXN Comprobante_Certificado xxx Comprobante_SubTotal 00.00 Comprobante_CondicionesDePago Contado Comprobante_NoCertificado 000000 Comprobante_FormaPago 03 Comprobante_Sello XXXXXx Comprobante_Fecha 2022-01-14T10:45:18 Comprobante_Folio 13 Comprobante_Serie MM Comprobante_Version 3.3 Comprobante_xmlns_cfdi http://www..... Emisor_Rfc AAAAAA Emisor_Nombre XXXXX Emisor_RegimenFiscal 621 Receptor_Rfc XXXXXX Receptor_Nombre XXXXX Receptor_UsoCFDI G03 Impuestos_TotalImpuestosTrasladados 0000.00 Impuestos_Traslado_Impuesto 002 Impuestos_Traslado_TipoFactor Tasa Impuestos_Traslado_TasaOCuota 0.160000 Impuestos_Traslado_Importe 000.36 Complemento_xmlns_tfd http://www..... Complemento_xsi_schemaLocation http://www.....xsd Complemento_Version 1.1 Complemento_UUID 000000000 Complemento_FechaTimbrado 2022-01-14T10:57:01 Complemento_RfcProvCertif AAAAAAAAAAA Complemento_SelloCFD XXXXXX Complemento_NoCertificadoSAT 000000 Complemento_SelloSAT 000 Procesando concepto 43212108 Impresora Térmica de Ticket 58mm Concepto_ClaveProdServ 43212108 Concepto_Cantidad 2 Concepto_ClaveUnidad H87 Concepto_Unidad pieza Concepto_Descripcion Impresora Térmica de Ticket 58mm Concepto_ValorUnitario 500.00 Concepto_Importe 1000.00 Concepto_Traslado_Base 000.00 Concepto_Traslado_Impuesto 002 Concepto_Traslado_TipoFactor Tasa Concepto_Traslado_TasaOCuota 0.160000 Concepto_Traslado_Importe 000.00 Procesando concepto 43201830 Disco de Estado Sólido SSD 120GB Concepto_ClaveProdServ 43201830 Concepto_Cantidad 1 Concepto_ClaveUnidad H87 Concepto_Unidad pieza Concepto_Descripcion Disco de Estado Sólido SSD 120GB Concepto_ValorUnitario 650.00 Concepto_Importe 650.00 Concepto_Traslado_Base 650 Concepto_Traslado_Impuesto 002 Concepto_Traslado_TipoFactor Tasa Concepto_Traslado_TasaOCuota 0.160000 Concepto_Traslado_Importe 000.00 Procesando concepto 81111809 Instalación de Software a Equipo de Cómputo Concepto_ClaveProdServ 81111809 Concepto_Cantidad 1 Concepto_ClaveUnidad E48 Concepto_Unidad servicio Concepto_Descripcion Instalación de Software a Equipo de Cómputo Concepto_ValorUnitario 100.00 Concepto_Importe 100.00 Concepto_Traslado_Base 100.00 Concepto_Traslado_Impuesto 002 Concepto_Traslado_TipoFactor Tasa Concepto_Traslado_TasaOCuota 0.160000 Concepto_Traslado_Importe 00.00 |
|
![]() |
|
RUGALB ![]() Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Asiduo ![]() ![]() Unido: 21/Julio/2006 Localización: Mexico Estado: Sin conexión Puntos: 432 |
![]() |
Muchas Gracias por todas tus observaciones Bacterio
![]() De antemano sé que aunque mi código "funciona" es muy redundante y hasta mal estructurado, desgraciadamente tuve que implementar algo a la brevedad por la premura del tiempo. Es verdad que desconocía todo esto del tratamiento de XML y me toca ir aprendiendo sobre la marcha. Te agradezco en verdad la molestia que te tomaste al analizar el problema de fondo y tomarte el tiempo para escribri todo ese código, Me pongo ahora mismo a analizarlo e implementarlo, espero que me des la oportunidad de aclarar alguna duda si la hubiese en el camino. Mil Gracias, un honor para mi leerte. Saludos Edito para hacer un par de notas 1.- Ya pensaba "migrar" a la brevedad los datos por así decirlo "fijos"(Comprobante, Emisor, Receptor, Impuestos y Complemento) a una tabla aparte para no almacenar tanta información en la tabla principal (Conceptos y Concepos_Impuestos) aunque al final del día la trabaja como una tabla temporal solo para el momento de traer los datos del XML, se hace un procedimiento con esa información y luego vacío la tabla 2.- No me agrada tanto eso de los namespaces realmente, desafortunadamente el fichero no lo genero yo, así viene de "fábrica" generado por la entidad fiscal :(
Editado por RUGALB - 17/Agosto/2022 a las 23:20 |
|
Saludos desde Toluca, Estado de Mexico "El pesimista se queja del viento, el optimista espera que cambie, el realista ajusta las velas"(William Ward)
|
|
![]() |
|
emiliove ![]() Administrador ![]() Unido: 16/Junio/2009 Localización: Mexico Estado: Sin conexión Puntos: 5670 |
![]() |
Yo igual no se para que quieres tener toda la información del cfdi, yo igual lo tuviera en dos tablas la factura y el detalle con solo la información necesaria y la ruta del cfdi por si necesitará más datos siempre puedo extaerlos.
Saludos y gracias Bacterio.
|
|
![]() |
Responder ![]() |
Página 12> |
Tweet
|
Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |