xml-matriz

Iniciado por PETTETE, 4 Julio 2017, 08:13 AM

0 Miembros y 1 Visitante están viendo este tema.

PETTETE

Hola buenas,

estoy intentando guardar un archivo xml en una matriz peor no me sale..

e.j del xml:

envio
     cabecera
            aplicacion =12
     datos
             personales
                       nombre=pepe
              color= rojo

estoy intentando guardar los datos por filas y columnas apra luego apsar al excel, pero la matriz se me queda vacia, los datos no se guardan..

¿algún con sejo de como puedo hacerlo?

toda ayuda es bien agradecida.

Un saludo de vuestro amigo y vecino,
PETETE;)
UN SALUDO DE VUESTRO AMIGO Y VECINO,
PETETE;)

Eleкtro

#1
Cita de: PETTETE en  4 Julio 2017, 08:13 AMestoy intentando guardar los datos por filas y columnas apra luego apsar al excel, pero la matriz se me queda vacia, los datos no se guardan..

Bueno, ¿pero vas a mostrarnos el código que estás utilizando para realizar tal operación de conversión y así poder intentar ayudarte a descubrir donde está el fallo, o debemos sacar la bola de cristal para adivinarlo?. Lo siento pero he perdido la cuenta de todas las veces que te habré repetido la ausencia de información...

De todas formas, tienes a tu disposición la clase System.Xml.Linq.XElement para representar el contenido de un documento Xml, entre otras clases relacionadas, y yo supongo que ya estarás utilizando alguna de esas clases, entonces, ¿por qué te resulta tan necesaría la conversión de un tipo cuya función es precisamente la de representar un documento Xml, a un Array uni o multidimensional?.

Saludos








PETTETE

#2
sisi cierto es.. lo siento ahora comparto el codigo, o parte del codigo.

Imports Microsoft.Office.Interop.Excel
Module Module1
   Dim xlapp As Microsoft.Office.Interop.Excel.Application
   Dim xllibro As Microsoft.Office.Interop.Excel.Workbook
   Dim xlhoja As Microsoft.Office.Interop.Excel.Worksheet
   Dim numfila As Integer = 1
   Dim numcolumna As Integer = 0
   Dim bsalida(,)
   Dim reader As New System.Xml.XmlTextReader("C:\Users\PEPE\Desktop\PEPE\archivos XML\Imp-BD20170239.XML")
   Sub Main()

       Dim contents As String = ""
       xlapp = New Microsoft.Office.Interop.Excel.Application
       xllibro = xlapp.Workbooks.Add
       xlhoja = xllibro.Worksheets("Hoja1")
       xlapp.Visible = True
       While reader.Read()
           reader.MoveToContent()
           If reader.NodeType = Xml.XmlNodeType.Element Then
               contents &= reader.Name & ": "
               ' datos_array()

           End If
           If reader.NodeType = Xml.XmlNodeType.Text Then
               contents &= reader.Value & _
                   Microsoft.VisualBasic.ControlChars.CrLf

           End If



       End While

       escribir_excel()

       'Console.WriteLine(reader.Name & vbTab & contents)
       'Console.ReadLine()

   End Sub

   public enum c0 as integer  
           nombre=1  
           apellido=2
           sexo=3
   end sub
   sub array()
    bsalida(fila, c0.nombre)= ???
    bsalida(fila, c0.apellido)=???
    bsalida(fila, c0.sexo)=???
    end sub
   Sub escribir_excel()

       Dim num_filas As Integer = bsalida.GetLength(0) - 1
       Dim num_colus As Integer = bsalida.GetLength(1) - 1

       '

       Dim rango As Microsoft.Office.Interop.Excel.Range = xlhoja.Range(xlhoja.Cells(1, 1), xlhoja.Cells(num_filas + 1, num_colus)) ' seleccionamos el rango de celdas,
       With rango '  
           .NumberFormat = "@" ' formato texto, para que no quite ceros a izda
           .Value = bsalida                                               ' le añadimos la matriz completa,
           '.Cells.EntireColumn.AutoFit()                               ' ajustamos el ancho de las columnas,
           '.Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbAqua                  ' y le damos un color
           ' ALTO DE LA CELDA -----
           .RowHeight = 15    ' ALTURA DE LAS CELDAS FIJA, PARA QUE AUTOAJUSTE
       End With
   End Sub
End Module


Lo que no se es con que igualar los datos del bsalida para que se guarden en el array.

agradecería mucho vuestra ayuda....

En este codigo faltan cosas por poner, me he dado cuenta ahora, en los 2 if reader.nodetype= falta por poner codigo....

A ver, la cosa que tengo un codigo que lee el mismo xml y lo pasa a excel. Pero en vez hacer columnas lo escribe todo en una linea y es lo que tengo que corregir, por eso quiero meterlo en un array.
El segundo codigo del que hablo es este:

Imports System.Xml
Imports Microsoft.Office.Interop.Excel
Module Module1

    Dim dato As String = ""
    Dim documentoXML As Xml.XmlDocument
    Dim nodoprincipal As Xml.XmlNode


    Dim xlapp As New Microsoft.Office.Interop.Excel.Application()
    Dim xllibro As Microsoft.Office.Interop.Excel.Workbook
    Dim xlhoja As Microsoft.Office.Interop.Excel.Worksheet

    Dim columna As Integer = 1
    Dim fila As Integer = 2

    Sub Main()

        '''''XML'''''
        documentoXML = New Xml.XmlDocument  'CREAMOS OBJETO XML
        documentoXML.Load("xml1.XML")           'CARGAMOS XML1 EN OBJETO XML

        'Linea1.Text = DocumentoXml.FirstChild.InnerText ' PRIMER NODO=CODIFICACION


        nodoprincipal = documentoXML.Item("EnvioEntrada") ' LE DECIMOS QUE ENVIOENTRADA ES EL NODO  PRINCIPAL

        '''''EXCEL'''''
        xllibro = xlapp.Workbooks.Add
        xlhoja = xllibro.Worksheets("Hoja1")
        xlapp.Visible = True

        nodo_cabecera(nodoprincipal)

    End Sub

    Sub nodo_cabecera(nodoprincipal As Xml.XmlNode)

        'ANALIZAMOS EL NODO CABECERA

        Dim nodocabecera As Xml.XmlNode
        Dim nodohijo As Xml.XmlNode
        Dim atributo As XmlAttribute

        nodocabecera = nodoprincipal.Item("Cabecera")   'CABECERA ES EL NODO SECUNDARIO

        For Each nodohijo In nodocabecera
            Select Case nodohijo.Name
                Case "Aplicacion"  ' NODO HIJO1 DE NODO CABECERA
                    dato = nodohijo.InnerText
                Case "NumeroEnvio" ' NODO HIJO2 DE NODO CABECERA
                    For Each atributo In nodohijo.Attributes 'ESPECIFICAMOS LOS 3 ATRIBUTOS DEL NODO NUMEROENVIO
                        If atributo.Name = "Universidad" Then dato = atributo.Value
                        If atributo.Name = "AñoGeneracionEnvio" Then dato = atributo.Value
                        If atributo.Name = "Contador" Then dato = atributo.Value
                    Next
                Case "FechaEnvio" ' NODO HIJO3 DE NODO CABECERA
                    dato = nodohijo.InnerText
            End Select
            datos_excel_cabecera(nodohijo, nodocabecera, atributo)

        Next
        nodo_expediente(nodoprincipal, dato, nodocabecera, atributo)
    End Sub
    Sub nodo_expediente(nodoprincipal As Xml.XmlNode, dato As String, nodocabecera As XmlNode, atributo As XmlAttribute)

        'ANALIZAMOS EL NODO EXPEDIENTE

        Dim nodoexpediente As Xml.XmlNode 'NODOEXPEDIENTE ES NODO SECUNDARIO
        Dim nodohijo As Xml.XmlNode
        Dim nombrecabecera As String

        For Each nodoexpediente In nodoprincipal 'LEEMOS TODOS LOS NODOS HIJOS DEL NODO EXPEDIENTE
            If nodoexpediente.Name <> "Cabecera" Then
                For Each nodohijo In nodoexpediente

                    nombrecabecera = nodoexpediente.Name

                    Select Case nodohijo.Name
                        Case "NumeroExpediente"
                            dato = nodohijo.InnerText   'NUMEROEXPEDIENTE.TEXT = NODOHIJO.INNERTEXT ???
                        Case "NumeroRegistroUniversitario"
                            dato = nodohijo.InnerText
                        Case "NumeroRegistroNacional"
                            dato = nodohijo.InnerText
                        Case "DatosPersonales"
                            If nodohijo.HasChildNodes Then
                                datospersonales_expediente(nodohijo, nodoexpediente)
                            End If

                        Case "TipoTitulo"
                            dato = nodohijo.InnerText
                        Case "TipoDocumento"
                            dato = nodohijo.InnerText
                        Case "ProgramaConjunto"
                            dato = nodohijo.InnerText
                        Case "Estudio"
                            dato = nodohijo.InnerText
                        Case "FechaConsejoMinis"
                            dato = nodohijo.InnerText
                        Case "FechaPublicacion"
                            dato = nodohijo.InnerText
                        Case "FechaFinEstudios"
                            dato = nodohijo.InnerText
                        Case "FechaExpedDocumento"
                            dato = nodohijo.InnerText
                        Case "CausaPropuesta"
                            dato = nodohijo.InnerText
                        Case "Lengua"
                            dato = nodohijo.InnerText
                        Case "MencionDoctor"
                            dato = nodohijo.InnerText
                        Case "ErasmusMundus"
                            dato = nodohijo.InnerText
                       ' bsalida(fila, c0.ErasmusMundus)=nodohijo.innertext
                        Case "CodCentro"
                            dato = nodohijo.InnerText
                    End Select

                    If nodohijo.Name = "DatosPersonales" Then
                        GoTo SALTAR
                    End If
                    datos_excel_expediente(nodohijo, nodoexpediente, nodocabecera, atributo)
SALTAR:

                Next
               
            End If
        Next

        'xlhoja.Range("F2:H2").Merge()                                      '4 LINEAS PARA:
        'xlhoja.Range("F2:H2").Value = "Prueba de combinación"              '    COMBINAR CELDAS
        'xlhoja.Range("F1:H1").Merge()                                      '    Y DARLES NUEVOS VALORES
        'xlhoja.Range("F1:H1").Value = "AAAAA"
    End Sub

    Sub datos_excel_cabecera(nodohijo, nodocabecera, atributo)

        'ESCRIBIMOS LOS DATOS DEL NODO CABECERA

        xlhoja.Rows(1).Font.Bold = True ' PRIMERA LINEA DEL EXCEL EN NEGRITA


        xlapp.Worksheets("Hoja1").cells(1, columna) = nodohijo.name
        xlapp.Worksheets("Hoja1").cells(2, columna) = nodohijo.innertext

        columna += 1

        For Each atributo In nodohijo.attributes
            xlapp.Worksheets("Hoja1").cells(1, columna) = atributo.name
            xlapp.Worksheets("Hoja1").cells(2, columna) = atributo.value
            columna += 1
        Next
       


    End Sub
    Sub datos_excel_expediente(nodohijo, nodoexpediente, nodocabecera, atributo)

        'ESCRIBIMOS LOS DATOS DEL NODO EXPEDIENTE (MENOS LOS HIJOS DEL NODO DATOS PERSONALES)
        'If nodohijo.name = "NumeroExpediente" Then

        '    fila += 1
        '    columna = 7

        'End If
        xlapp.Worksheets("Hoja1").cells(1, columna) = nodohijo.name
        'seguir1:

        xlapp.Worksheets("Hoja1").cells(fila, columna) = nodohijo.innertext

        columna += 1


    End Sub
    Sub datospersonales_expediente(nodohijo, nodocabecera)

        'ESCRIBIMOS LOS NODOS HIJO DEL NODO HIJO DATOS PERSONALES

        For Each nodohijo In nodohijo.childnodes
            xlapp.Worksheets("Hoja1").cells(1, columna) = nodohijo.Name

            xlapp.Worksheets("Hoja1").cells(fila, columna) = nodohijo.innertext

            columna += 1

        Next

    End Sub
   
End Module


HE intentado poner aqui la enumeración y definir el array bsalida(fila, enumeracion). En algun sitio tiene que estar comentado algun ejemplo de eso.
La cosa es que en el excel tienen que aparecer los nombres de los hijos de cada registro en la fila 1 y los datos en las filas 2 en adelante..
Algun registro tiene 1 dato que los otros no y esto modifica todo el excel porque no respeta el nodohijo.name del nodo hijo( hermano).
No se si me estoy explicando bien...

Yo comparto los dos codigos y en caso de duda preguntar que os contestare lo mas claro que pueda..

Un saludo y muchas gracias!!!!
UN SALUDO DE VUESTRO AMIGO Y VECINO,
PETETE;)

PETTETE

Hola buenas,
El mismo problema pero intento realizarlo de una manera. el codigo me da ERROR.

primero leo el xml, segundo, guardo lo que leo en un string y asigno el string a una posicion de un array.

Dim bsalida(,) As String

Dim dato1 As String

Public Enum c0 As Integer
                aplicacion = 2
End Enum

For Each nodohijo In nodocabecera
            Select Case nodohijo.Name
                Case "Aplicacion"  ' NODO HIJO1 DE NODO CABECERA
                    dato1 = nodohijo.InnerText
Next

bsalida(fila, c0.aplicacion) = dato1

  Dim num_filas As Integer = bsalida.GetLength(0) - 1
        Dim num_colus As Integer = bsalida.GetLength(1) - 1

        Dim rango As Microsoft.Office.Interop.Excel.Range = xlhoja.Range(xlhoja.Cells(1, 1), xlhoja.Cells(num_filas + 1, num_colus)) ' seleccionamos el rango de celdas,
        With rango '   
            .NumberFormat = "@" ' formato texto, para que no quite ceros a izda
            .Value = bsalida                                               ' le añadimos la matriz completa,
            '.Cells.EntireColumn.AutoFit()                               ' ajustamos el ancho de las columnas,
            '.Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbAqua                  ' y le damos un color
            ' ALTO DE LA CELDA -----
            .RowHeight = 15    ' ALTURA DE LAS CELDAS FIJA, PARA QUE AUTOAJUSTE
        End With



        xlapp.ReferenceStyle = Microsoft.Office.Interop.Excel.XlReferenceStyle.xlR1C1 'xlR1C1


Este codigo es el mio pero acortado. Es lo mismo pero una enumeracion mas larga mas datos como string y demás..
La cosa es que al ejecutar este codigo me da error nada mas lee bsalida(fila, c0.aplicacion)=dato1.
El error es el siguiente: Referencia a objeto no establecida como instancia de un objeto.

Agradecería mucho una ayudita..

Un saludo de vuestro amigo y vecino,
PETETE;)
UN SALUDO DE VUESTRO AMIGO Y VECINO,
PETETE;)

Eleкtro

Cita de: PETTETE en  7 Julio 2017, 09:56 AM
bsalida(fila, c0.aplicacion)=dato1

El error es el siguiente: Referencia a objeto no establecida como instancia de un objeto.

El error se explica por si mismo, te está diciendo que uno de los siguientes objetos es nulo (Nothing): fila, o el valor devuelto por el miembro bsalida

Depura tu código para comprobar cual es la referencia nula.

Saludos