Jump to content
  • Debido a la crisis sanitaria, hasta el día 31 de marzo, el registro al foro de Ayuda Excel será totalmente gratuito para facilitar el teletrabajo. Todos los registros que se produzcan entre estas fechas tendrán acceso gratuito ilimitado a la comunidad hasta el 30 de abril.

    Regístrate

    Si te surge alguna duda mientras estás trabajando en casa con Excel, ya tienes a quien preguntar.

    Espero que esta medida te sirva de ayuda. Frenar la expansión del coronavirus depende de todos. Sé responsable.

Luis Perez

Extraer nodos de los xml version 3.2 y 3.3 (Mex)

Recommended Posts

Buena tarde estimados participantes de este foro, les comento que estoy teniendo problemas para extraer los nodos de los xml versión 3.3 las valiosas herramientas para esta función aquí presentadas solo extraen la información de los xml versión 3.2 por esta razón solicito amablemente de su apoyo para poder adecuar la lacro que dejo aquí de ejemplo o en su defecto crear una nueva que pueda extraer la información de las 2 versiones de los archivos xml

De antemano gracias 

dejo en esta petición la macro en txt y dos archivos xml uno versión 3.23 y uno versión 3.3

ejemplo xml  versión 3.3:

<cfdi:Receptor Nombre

ejemplo xml versión 3.2: 

-<cfdi:Receptor nombre

4DFFC47C-77BA-4630-98FB-268C1DE3474D.xmlMacro ExtraerFolioFiscal.txt

1A62E00C-E814-4B72-B32B-68223B9245D9.xml

Share this post


Link to post
Share on other sites

algunos conceptos como: cantidad, descripcion, valorunitario, ... se refieren a artículos facturados por lo que podrían ser mas de uno

una pregunta es: hay que extraer todas esas referencias y sus relacionados (iva y demás) ?
si la respuesta es si... algún orden especifico para cuando existan dos (o mas) artículos facturados ?

otra pregunta es: obtienes los xml solo de la pagina del sat ?
(por lo general el nombre del archivo es el dato de uuid)

saludos,
hector.

Share this post


Link to post
Share on other sites

Mario gracias por el archivo, solo que existe un problema por resolver

para efectos de mi trabajo requiero tener la información de las 2 versiones de los xml en una hoja de excel.

es decir que el objetivo de mi solicitud es poder extraer en un solo proceso los datos

 

te comento que antes de la versión 3.3 podía extraer la información sin ningún problema

te doy idea del proceso en mi trabajo

1-descargar los xml (aprox 2000) 

2-extraer la información en una hoja de excel

3 distribuir los gastos a cada contribuyente por medio de sumar.si utilizanco como referencia el rfc

por esta sencilla razón surgió la necesidad de solicitarles de su valioso apoyo

de antemano gracias

 

Share this post


Link to post
Share on other sites

hola, a todos !

Hace 3 horas, Luis Perez dijo:

el objetivo de mi solicitud es poder extraer en un solo proceso los datos...

1-descargar los xml (aprox 2000)

veo que no te gusta "perder el tiempo" contestando preguntas que "parecen" no tener nada que ver con la situación que planteas (?), por lo tanto, solo te haré los comentarios necesarios para resolver esa situación conservando el modelo de programación que ya usas

1° agrega al inicio del modulo (antes del procedimiento) la siguiente instrucción:

Option Compare Text

2° agrega las siguientes 3 condiciones en el área correspondiente:

        If Trim(Cells(2, y)) = "/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado/@TasaOCuota" Then
          trasladotasa = Cells(3, y) * 100
        End If
        If Trim(Cells(2, y)) = "/@formaPago" Then
          formadepago = Cells(3, y)
        End If
        If Trim(Cells(2, y)) = "/@metodoPago" Then
          metododepago = Cells(3, y)
        End If

3° cada que asignas valores a las variables "del caso" NO las restableces a "vacío" por lo que si en el siguiente paso NO hay dato que reportar, se conserva (y se reporta) el ultimo valor asignado, para evitarlo complementa cada instrucción del tipo:

      Range("B" & fila) = folio
      Range("C" & fila) = Uuid
      Range("D" & fila) = fecha
      ' ... etc.

con el vaciado de la variable:

      Range("B" & fila) = folio: folio = ""
      Range("C" & fila) = Uuid: Uuid = ""
      Range("D" & fila) = fecha: fecha = ""
      ' ... etc.

4° no eches "en saco roto" las preguntas relativas a los conceptos que llevan: descripcion, valorunitario, etc., debo insistir en que si la factura incluye mas de un articulo/servicio no vas a obtener la suma de los impuestos correspondientes

5° el "ieps" tiene un tratamiento especial que debe ser separado de los impuestos trasladados

6° deberías agregar títulos a la primera fila de los datos obtenidos (y decidir -bien- cuales campos son realmente necesarios -y en que orden-)

7° el que hagas ciclos por todas las columnas del XML abierto (supongo) es porque no sabes en que orden van a aparecer en la apertura (?)

8° podrías NO abrir los ".xml" (EN EXCEL) ya que estas invirtiendo (mal gastando) recursos y tiempo de proceso

saludos,
hector.

Share this post


Link to post
Share on other sites

Buenas @Luis Perez

Disculpa mi comentario pero coincido con Héctor, no evadas por favor las dudas que nos surgen para poder ayudarte, ya que todos nos tomamos el tiempo y las molestias para poder apoyar, mi humilde opinión.

y en relación a tu solicitud, checa el siguiente archivo, como no nos proporcionas algún archivo Excel que describa el orden y los datos específicos que necesitabas de ambas versiones de los xml como bien dice Héctor.

Ordene los datos a mi consideración, tomando como criterio la mayoría de los datos importantes que uso en mis trabajos de auditoria

No olvides comentar si te fue de utilidad.

Saludos

Xml 3.2 & 3.3 CFDI.rar

Share this post


Link to post
Share on other sites
En 15/10/2017 at 0:48 , Héctor Miguel dijo:

veo que no te gusta "perder el tiempo" contestando preguntas que "parecen" no tener nada que ver con la situación que planteas (?), por lo tanto, solo te haré los comentarios necesarios para resolver esa situación conservando el modelo de programación que ya usas

7° el que hagas ciclos por todas las columnas del XML abierto (supongo) es porque no sabes en que orden van a aparecer en la apertura (?)

8° podrías NO abrir los ".xml" (EN EXCEL) ya que estas invirtiendo (mal gastando) recursos y tiempo de proceso.

Para empezar este tema se menciono en otro tema, yo le recomendé a @Luis Perez que abriera un nuevo tema para que se le pudiera ayudar. Coincido en estos dos últimos puntos es sumamente lento y no quiero pensar en cuanto se va a tardar para 2000 archivos. Estoy viendo que por lo menos en México se venden herramientas de todo tipo para trabar con XML y la mayor parte de la gente que no tiene conocimientos en XML o VBA o no le interesa investigar al respecto termina comprando alguna de estar herramientas. Creo que para poder minar archivos XML, no gasta un centavo y sobre todo sin necesitar conocimientos de programación se tienen dos opciones:

1. La función XMLFiltro disponible en Excel 2013 en adelante en la cual solo hay que brindarle la cadena XML y la ruta Xpath del atributo que queramos extraer.
2. xmlstarlet que funciona bajo linea de comandos y sin duda es muy rápido por que es a nivel consola.

Saludos y suerte! 

Share this post


Link to post
Share on other sites

Mi gratitud a Hector, Mario y a DigitalBoy por compartir sus conocimientos.

honestamente no estoy echando en saco roto sus comentarios y valioso apoyo.

en realidad empiezo a incursionar en este tema de las macros y todo me resulta muy confuso aun, le doy la razón a digitalboy  en cuanto que existimos personas que no nos esforzamos por aprender un poco mas.

actualmente no es mi caso.

probando el archivo amablemente enviado por Mario me di cuanta del problema del iva

 

Saludos

 

Share this post


Link to post
Share on other sites
Hace 22 horas, Luis Perez dijo:

no estoy echando en saco roto sus comentarios ... en realidad empiezo a incursionar en este tema de las macros y todo me resulta muy confuso aun ...

  • como aun no respondes que campos te son imprescindibles o que arreglo prefieres, yo también me invente un modelo (+/- lógico con los importes al final) para que hagas pruebas y comentes los cambios necesarios
  • puedes agregar hojas por si necesitas obtener datos de distintas carpetas PERO, el código esta "casado" con el libro, es decir, si copias la macro a otro libro NO te va a funcionar :(

descarga el adjunto, lo pruebas, y comentas (cambios, fallas, etc.)

saludos,
hector.

getFromCfdiMx.zip

Share this post


Link to post
Share on other sites

hola, a todos !

En 16/10/2017 at 12:00 , digitalboy dijo:

para poder minar archivos XML, no gasta un centavo y sobre todo sin necesitar conocimientos de programación ...:

1. La función XMLFiltro disponible en Excel 2013 en adelante en la cual solo hay que brindarle la cadena XML y la ruta Xpath del atributo que queramos extraer.

ya hiciste alguna prueba para poder aprovechar la función xmlFiltro bajo la situación especifica planteada por @Luis Perez ? resulta interesante pero le resta aun talacha (y bastante) para conjuntar las condiciones

saludos,
hector.

Share this post


Link to post
Share on other sites

@Héctor Miguel... contestando a tu pregunta de:

Hace 1 hora, Héctor Miguel dijo:

ya hiciste alguna prueba para poder aprovechar la función xmlFiltro bajo la situación especifica planteada por @Luis Perez ? resulta interesante pero le resta aun talacha (y bastante) para conjuntar las condiciones

Ya he realizado 3 desarrollos usando esta función y realmente funciona. Respecto a que no cumple las condiciones de este problema en efecto no las cumple. XMLFiltro funciona inicialmente para una extracción de unos cuantos campos de un solo archivo. Pero yo la combina con macros donde en una hoja establezco todos los campos a minar, con la macro selecciono los archivos y voy recorriendo archivo por archivo extrayendo los datos y concentrándolos. En cuanto tenga bien pulida esta macro con una buena interfaz estare compartiendo una versión de prueba en el foro.

Saludos!

Share this post


Link to post
Share on other sites

Hector /Digitalboy,  Buen día

haciendo pruebas con xmlfiltro se obtienen resultados rápidos el detalle es que en mi ejemplo tuve que insertar de manera manual las cadenas delos xml para que funcione.

es posible crear una macro que extraiga las cadenas de los xml para insertarlas en una hoja de excel?

dejo aquí el la pruebas efectuadas

Saludos

 

xmlFiltro.xlsx

Share this post


Link to post
Share on other sites
En 17/10/2017 at 21:46 , Héctor Miguel dijo:
  • como aun no respondes que campos te son imprescindibles o que arreglo prefieres, yo también me invente un modelo (+/- lógico con los importes al final) para que hagas pruebas y comentes los cambios necesarios
  • puedes agregar hojas por si necesitas obtener datos de distintas carpetas PERO, el código esta "casado" con el libro, es decir, si copias la macro a otro libro NO te va a funcionar :(

descarga el adjunto, lo pruebas, y comentas (cambios, fallas, etc.)

saludos

Hector, ya probé el archivo y funciona muy bien, no detecte ningun problema con la extracción de los impuestos.

estoy preparando la organización de los datos para en la medida de lo posible solicitar de tu ayuda

de antemano gracias

Share this post


Link to post
Share on other sites

hola, a todos !

Hace 52 minutos , Luis Perez dijo:

es posible crear una macro que extraiga las cadenas de los xml para insertarlas en una hoja de excel?

sip !, es parte de lo que hace la macro del adjunto anterior ;)

para aprovechar la función xmlFiltro tengo avanzado el proyecto que consta de macros simples para 1) obtener la lista de archivos y 2) extraer la cadena xml de cada archivo, 3) el resto va con solo la función xmlFiltro (claro, adaptado al caso exclusivo de tu consulta), solo estoy también puliendo la interfaz

saludos,
hector.

Share this post


Link to post
Share on other sites

hola, a todos !

En 20/10/2017 at 11:06 , Luis Perez dijo:

haciendo pruebas con xmlfiltro se obtienen resultados rápidos el detalle es que

vamos a ver si (ahora) das respuesta (puntual) a las (RE)preguntas que se hacen (?)...

primero: del archivo que adjuntas con la función xmlFiltro...

a) solo obtiene datos de la versión 3.2, ya tienes las adaptaciones para la versión 3.3 ?

b ) son esos (todos y los únicos) conceptos los que necesitas leer de los xml (y en ese orden) ?
=> hay algunos conceptos de los que no rescatas datos (descuento y retenciones -iva, isr-)

c) con respecto de la descripción (concepto) que (insisto) pudiera contener MAS de un articulo facturado (p.ej.)
=> selecciona [H4] > pulsa {F2}+{F9} > veras que contiene una matriz de dos datos ({"INTERESES";"COMISIONES"})0
=> solo reportas el primero (intereses)
1) que esperas cuando existan dos (o mas) descripciones (y sus correspondientes valores para impuestos y demás) ?
2) en que orden (y en cuales columnas) tendrían que reportarse del segundo en adelante (y cuantos de ellos ) ?

d) te interesa conservar las formulas (xmlFiltro y otras que son lentas a la edición), o solo los valores resultantes ?
=> si las formulas no son necesarias tampoco es prudente (creo) conservar el texto de los archivos xml consultados (?)

segundo: de la macro propuesta en el mensaje y adjunto anterior...

a) consideras necesario agregar/eliminar algún campo consultado (y cual/es y donde) ?

saludos,
hector.

Edited by Héctor Miguel

Share this post


Link to post
Share on other sites
On 15/10/2017 at 11:13 PM, Mario Rodz said:

Buenas @Luis Perez

Disculpa mi comentario pero coincido con Héctor, no evadas por favor las dudas que nos surgen para poder ayudarte, ya que todos nos tomamos el tiempo y las molestias para poder apoyar, mi humilde opinión.

y en relación a tu solicitud, checa el siguiente archivo, como no nos proporcionas algún archivo Excel que describa el orden y los datos específicos que necesitabas de ambas versiones de los xml como bien dice Héctor.

Ordene los datos a mi consideración, tomando como criterio la mayoría de los datos importantes que uso en mis trabajos de auditoria

No olvides comentar si te fue de utilidad.

Saludos

Xml 3.2 & 3.3 CFDI.rar

Hola Luis, 

 

Tu archivo me sirvió de maravilla.. te lo agradezco mucho. solo una duda, es posible cargar los XMLS y que respete lo que ya se extrajo, para no tener que cargar todos los XMLS cada vez que voy a importar?

Share this post


Link to post
Share on other sites

 

Estimado amigo jofralao este archivo fue adecuado para la 2 versiones de los xml por  el buen amigo: Facebook: Mario A. Rodriguez / Email: ma_rodz@yahoo.com.mx

 

Saludos cordiales

En 8/1/2018 at 16:44 , jofralao dijo:

Hola Luis, 

 

Tu archivo me sirvió de maravilla.. te lo agradezco mucho. solo una duda, es posible cargar los XMLS y que respete lo que ya se extrajo, para no tener que cargar todos los XMLS cada vez que voy a importar?

 

Share this post


Link to post
Share on other sites

muchas gracias, ya probé "xml 3.2 &3.3 cdfi" y me funcionó bien, ya nada mas hay que adecuar la plantilla como uno quiera que aparezcan las columnas. agregué autosuma a las columnas de subtotales y totales, ésto para checar. saludos.

Share this post


Link to post
Share on other sites

hola buen dia hay alguien que pueda ayudar a xml de nomina necesito traer los conceptos  que trae el archivo xml estos son mis archivos grupo excel.rar

envio mi archivo de macro que se llama macro NOMINA  3-3.xlsm

Copia de 09_SABK880930663_SANCHEZ BENITEZ KARLA SOFIA111 este es lo que contiene el xml sus campos puedo traer los la columa amarilla en especial de la fila 40  a 54 no puedo o no se como hacerlo 

09_SABK880930663_SANCHEZ BENITEZ KARLA SOFIA.xml este es el xml como ejemplo que trabajo 

espero que puedan ayudarme la vdd ya no se como hacerle 

Share this post


Link to post
Share on other sites

Private documentoxml As MSXML2.DOMDocument
Private listanodos As MSXML2.IXMLDOMNodeList
Private nodo As MSXML2.IXMLDOMNode
Private fila As Double
Sub ABRIR_XML()
Dim dg As FileDialog, archivo As Variant
Set dg = Application.FileDialog(msoFileDialogFilePicker)
With dg
If .Show = -1 Then
For Each archivo In .SelectedItems
ActiveCell.Value = archivo
ActiveCell.Offset(1, 0).Range("A1").Select
Next archivo
Else
End If
End With
End Sub

Function CONTAR_NODOS(ruta As String, nombrenodo As String) As String
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
Set listanodos = documentoxml.getElementsByTagName(nombrenodo)
CONTAR_NODOS = listanodos.Length
End Function

Function OBTENER_ATRIBUTOS(ruta As String, nombrenodo As String, estenodo As Integer, atributo As String) As String
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
Set listanodos = documentoxml.getElementsByTagName(nombrenodo)
OBTENER_ATRIBUTOS = listanodos.Item(estenodo).Attributes.getNamedItem(atributo).Text
End Function

Function OBTENER_XML(ruta As String) As String
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
OBTENER_XML = documentoxml.XML
End Function

Sub OBTENER_TODOS_ATRIBUTOS(ruta As String, nombrenodo As String, estenodo As Integer)
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
Set listanodos = documentoxml.getElementsByTagName(nombrenodo)
For x = 0 To listanodos.Item(estenodo).Attributes.Length - 1
ActiveCell.Value = listanodos.Item(estenodo).Attributes.Item(x).nodeName
ActiveCell.Offset(0, 1).Range("A1").Select
Next x
End Sub

Sub LLAMAR_OBTENER_TODOS_ATRIBUTOS()
Dim ruta As String, nombrenodo As String, estenodo As Integer
ruta = Range("B2").Value
nombrenodo = Range("C2").Value
estenodo = Range("D2").Value
Call OBTENER_TODOS_ATRIBUTOS(ruta, nombrenodo, estenodo)
End Sub

Sub OBTENER_TODOS_NODOS_HIJO(ruta As String, nombrenodo As String, estenodo As Integer)
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
Set listanodos = documentoxml.getElementsByTagName(nombrenodo)
For x = 0 To listanodos.Item(estenodo).ChildNodes.Length - 1
    ActiveCell.Value = listanodos.Item(estenodo).ChildNodes.Item(x).nodeName
    ActiveCell.Offset(1, 0).Range("A1").Select
Next x
End Sub

Sub LLAMAR_OBTENER_TODOS_NODOS_HIJO()
Dim ruta As String, nombrenodo As String, estenodo As Integer
Dim rutarango As Range, nombrenodorango As Range, estenodorango As Range
Set rutarango = Application.InputBox("Selecciona la ruta del XML", "RUTA XML", Type:=8)
Set nombrenodorango = Application.InputBox("Selecciona el nombre del nodo", "NOMBRE DEL NODO", Type:=8)
Set estenodorango = Application.InputBox("Selecciona el número del nodo", "NÚMERO DEL NODO", Type:=8)
ruta = rutarango.Value
nombrenodo = nombrenodorango.Value
estenodo = estenodorango.Value
Call OBTENER_TODOS_NODOS_HIJO(ruta, nombrenodo, estenodo)
End Sub

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png