elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  xml-matriz
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: xml-matriz  (Leído 3,919 veces)
PETTETE

Desconectado Desconectado

Mensajes: 127


Ver Perfil
xml-matriz
« en: 4 Julio 2017, 08:13 am »

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;)


En línea

UN SALUDO DE VUESTRO AMIGO Y VECINO,
PETETE;)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: xml-matriz
« Respuesta #1 en: 4 Julio 2017, 09:18 am »

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..

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


« Última modificación: 4 Julio 2017, 09:22 am por Eleкtro » En línea

PETTETE

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: xml-matriz
« Respuesta #2 en: 4 Julio 2017, 11:06 am »

sisi cierto es.. lo siento ahora comparto el codigo, o parte del codigo.
Código:
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:
Código:
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!!!!
« Última modificación: 4 Julio 2017, 11:21 am por PETTETE » En línea

UN SALUDO DE VUESTRO AMIGO Y VECINO,
PETETE;)
PETTETE

Desconectado Desconectado

Mensajes: 127


Ver Perfil
Re: xml-matriz
« Respuesta #3 en: 7 Julio 2017, 09:56 am »

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.
Código:
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;)
En línea

UN SALUDO DE VUESTRO AMIGO Y VECINO,
PETETE;)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: xml-matriz
« Respuesta #4 en: 7 Julio 2017, 12:12 pm »

Código:
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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines