Saltar al contenido

EXTRAER DATOS DE SECCION CDATA DE XML


JUANJG

Recommended Posts

Buen día, desde ya muchas gracias por su colaboración.

 

Estoy tratando de leer o capturar la información contenida en el nodo Invoice que se encuentran en la sección CDATA del xml adjunto pero no lo consigo, he tratado con varios códigos pero ninguno me ha resultado por lo cual agradecería su valiosa ayuda con un pequeño ejemplo con cualquiera de los campos del nodo Invoice del xml adjunto.

El ultimo código con el que intente es el siguiente:

 

Sub My_Example_Test()
    Dim sXml As String
    sXml = "<Root><SomeData>foo</SomeData>" & "<SomeCDATA><![CDATA[< src=""C:\Users\HP\Desktop\ad08301097230342100195863.xml""/>]]>" & "</SomeCDATA></Root>"
    
    Dim Dom As MSXML2.DOMDocument60
    Set Dom = New MSXML2.DOMDocument60
    Dom.LoadXML sXml
    
    Dim xmlSomeCData As MSXML2.IXMLDOMElement
    Dim listanodos As MSXML2.IXMLDOMNodeList
    
    Set xmlSomeCData = Dom.SelectSingleNode("Root/SomeCDATA")
    Debug.Print xmlSomeCData.Text 'Deberia mostrar el texto pero muestra el directorio del xml

    'creo esta parte no se esta ejecutando
    Set listanodos = Dom.SelectNodes("Invoice")
    For Each nodo In listanodos
        Debug.Print nodo.Text
    Next nodo
End Sub

 

Saludos Excelers

ad08301097230342100195863.xml

Enlace a comentario
Compartir con otras webs

Hace 54 minutos , DiegoLG dijo:

Que datos necesitas que te extraiga en este nodo?

@DiegoLG , cualquiera de los datos que esta dentro del CDATA para tomarlo como ejemplo ya que necesito extraer la mayoría.

Por Ejemplo:

Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name = PayU Colombia S.A.S

Invoice/cac:LegalMonetaryTotal/cbc:LineExtensionAmount= 4902.63

Muchas Gracias

Enlace a comentario
Compartir con otras webs

Hace 1 hora, DiegoLG dijo:

Checa,

Para que te des una idea.

Saludos,

 

 

Hace 1 hora, DiegoLG dijo:

Checa,

Para que te des una idea.

Saludos,

 

@DiegoLG En los ejemplos se extraen datos de nodos normales de xml, eso lo puedo hacer, lo que no he podido es extraer información de los nodos dentro de la seccion CDATA.

 

Gracias

Enlace a comentario
Compartir con otras webs

Hace 1 hora, JUANJG dijo:

@isidro, la pagina me lleva a una opción de descarga FCDI pero el archivo XML que estoy trabajando no tiene que ver con CFDI.

 

Gracias

descarga este programa: descargarcfdi.zip y instalalo, ese programa tiene para importar xml a excel checalo, y me dices yo no puedo instalara programa en mi maquina no tengo permiso es maquina de mi trabajo, nosotros a qui en la empresa usamos uno de paga y ese es gratuito y la pagina dice

Convertir tus archivos XML a Excel

Podrás convertir la información de tus comprobantes fiscales (XML) exportándolos a MS Excel.

  • Tendrás todos los datos de tus XML, incluidos los conceptos.
  • Se genera un archivo de Excel con más de 120 columnas con los datos de los XML.
  • Se desglosan los impuestos retenidos y trasladados por tipo y tasa.
Enlace a comentario
Compartir con otras webs

nosotros usamos este link descargamos de SAT los xml y guardamos en una ruta y el programa tiene para importar los xml a excel, teda la opción de elegir la ruta, pero ese es de paga tiene de prueba de 10 días, ese que te pase es gratis checalo tambien @DiegoLG.

a ver si le funciona

saludos 

Enlace a comentario
Compartir con otras webs

Hace 1 hora, isidrod dijo:

nosotros usamos este link descargamos de SAT los xml y guardamos en una ruta y el programa tiene para importar los xml a excel, teda la opción de elegir la ruta, pero ese es de paga tiene de prueba de 10 días, ese que te pase es gratis checalo tambien @DiegoLG.

a ver si le funciona

saludos 

El archivo que intento leer NO es de CFDI NI se descarga de SAT por lo cual ninguna de las opciones me aplican.

 

Gracias

Enlace a comentario
Compartir con otras webs

este es lo que extraje de tu xml 

Sub From_XML_To_XL()
'https://www.extendoffice.com/es/documents/excel/3388-excel-import-multiple-text-csv-xml-files.html
'UpdatebyKutoolsforExcel20151214
    Dim xWb As Workbook
    Dim xSWb As Workbook
    Dim xStrPath As String
    Dim xFileDialog As FileDialog
    Dim xFile As String
    Dim xCount As Long
    
     With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
    On Error GoTo ErrHandler
    With Worksheets("Hoja1").Select
    
    
    Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    xFileDialog.AllowMultiSelect = False
    xFileDialog.Title = "Select a folder [Kutools for Excel]"
    If xFileDialog.Show = -1 Then
        xStrPath = xFileDialog.SelectedItems(1)
    End If
    If xStrPath = "" Then Exit Sub
    Application.ScreenUpdating = False
    Set xSWb = ThisWorkbook
    xCount = 1
    xFile = Dir(xStrPath & "\*.xml")
    Do While xFile <> ""
        Set xWb = Workbooks.OpenXML(xStrPath & "\" & xFile)
        xWb.Sheets(1).UsedRange.Copy xSWb.Sheets(1).Cells(xCount, 1)
        xWb.Close False
        xCount = xSWb.Sheets(1).UsedRange.Rows.Count + 2
        xFile = Dir()
    Loop
   
  End With
   .ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
    xSWb.Save
    Exit Sub
ErrHandler:

    MsgBox "no files xml", , "Kutools for Excel"
End Sub

ese el código

xml a excel.xlsx

Enlace a comentario
Compartir con otras webs

Hace 1 hora, isidrod dijo:

es todo lo que puedo hacer por ti

No es lo que necesito pero muchas gracias por la intención.

La macro que colocas extrae el contenido de los nodos normalitos de un xml lo cual lo puedo realizar de diferentes maneras, pero NO la información de los nodos dentro de una sección CDATA que es lo que preciso.

Enlace a comentario
Compartir con otras webs

Hola fíjate esto, recupere el cdata con esta ruta y despues lei ese xml y saque un dato que es una fecha, vos sabrás como sacar lo que necesitas puntualmente.

Sub My_Example_Test()

    Dim Dom As MSXML2.DOMDocument60
    Set Dom = New MSXML2.DOMDocument60

    Dom.Load "C:\Users\Windows\Downloads\ad08301097230342100195863.xml"
    MsgBox Dom.ChildNodes.Item(1).ChildNodes(11).ChildNodes.Item(0).ChildNodes.Item(2).ChildNodes.Item(0).Text
    Dom.LoadXML Dom.ChildNodes.Item(1).ChildNodes(11).ChildNodes.Item(0).ChildNodes.Item(2).ChildNodes.Item(0).Text
    MsgBox Dom.ChildNodes.Item(1).ChildNodes.Item(7).ChildNodes.Item(0).Text
End Sub

 

Enlace a comentario
Compartir con otras webs

Hace 16 horas, LeandroA dijo:

Hola fíjate esto, recupere el cdata con esta ruta y despues lei ese xml y saque un dato que es una fecha, vos sabrás como sacar lo que necesitas puntualmente.




Sub My_Example_Test()

    Dim Dom As MSXML2.DOMDocument60
    Set Dom = New MSXML2.DOMDocument60

    Dom.Load "C:\Users\Windows\Downloads\ad08301097230342100195863.xml"
    MsgBox Dom.ChildNodes.Item(1).ChildNodes(11).ChildNodes.Item(0).ChildNodes.Item(2).ChildNodes.Item(0).Text
    Dom.LoadXML Dom.ChildNodes.Item(1).ChildNodes(11).ChildNodes.Item(0).ChildNodes.Item(2).ChildNodes.Item(0).Text
    MsgBox Dom.ChildNodes.Item(1).ChildNodes.Item(7).ChildNodes.Item(0).Text
End Sub

 

Excelente, era lo que estaba buscando.

Muchas graciaaaas

Enlace a comentario
Compartir con otras webs

Si estas usando el xml adjunto al inicio del tema solo debes cambiar el directorio del mismo, si estas usando otro xml debes ver que dentro de la seccion cdata contenga los nodos hijos a que esta apuntando la instruccion Dom.Child...

Basicamente luego de abrir la seccion cdata ya puedes extraer laninformacion como lo haces en un xml normal.

Enlace a comentario
Compartir con otras webs

con estas líneas de código en la ventana inmediato leo todo el contenido del xml, incluso el de la cdata,  pero como haría para pasar dicho contenido en formato tabular a excel???

Sub TestXML3()
    Dim XDoc As Object
    
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.Load (ThisWorkbook.Path & "\ad09004905940102100002111.xml")
    
    'Get Document Elements
    Set lists = XDoc.DocumentElement
    
    'Traverse all elements 2 branches deep
    For Each listNode In lists.ChildNodes
        Debug.Print "---Email---"
        For Each fieldNode In listNode.ChildNodes
           Debug.Print "[" & fieldNode.BaseName & "] = [" & fieldNode.Text & "]"
           
            
        Next fieldNode
    Next listNode
    
    Set XDoc = Nothing
End Sub

Agradezco su ayuda

Enlace a comentario
Compartir con otras webs

Hace 6 horas, fjaimes04 dijo:

con estas líneas de código en la ventana inmediato leo todo el contenido del xml, incluso el de la cdata,  pero como haría para pasar dicho contenido en formato tabular a excel???

Agradezco su ayuda

ahí ya no te puedo ayudar, no se bien que seria tabular Excel, pero seguramente alguno mas podrá echar una mano en ese tema.

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
    • Agradecido Antoni! Tus sugerencias me ayudaron mucho! Como pudiese hacerte llegar el archivo?
    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.