none
crear un archivo xml

    Question

  • Hola, necesito crear un archivo xml como el que dejo en el codigo:

    es para facturacion electronica,  tengo los nodos comprobantes para englobar varios comprobantes(uno o mas), el nodo comprobante para detallar cada comprobante y el nodo detalles para detallar adentro cada detalle del comprobante

    me pueden guiar sobre la forma de encarar el armado del xml y que clase usar para armar el archivo, suponiendo qeu a los datos que quiero enviar ya los teng ocargados en un dataset con dos tablas( cabecera y detallefactura)

     

    <?xml version="1.0" encoding="UTF-8"?>
    <comprobantes>
      <comprobante>
        <tipo>num(2)</tipo>
        <ptovta>num(4)</ptovta>
        <cuitemisor>num(11)</cuitemisor>
        <fechaemision>fecha</fechaemision>
        <idioma>num(2)</idioma>
        <concepto>num(2)</concepto>
        <ape>texto(1)</ape>
        <moneda>texto(3)</moneda>
        <tipocambio>num(4,6)</tipocambio>
        <destinocmp>num(3)</destinocmp>
        <tipodocreceptor>num(2)</tipodocreceptor>
        <nrodocreceptor>num(11)</nrodocreceptor>
        <idimpositivoreceptor>texto(20)</idimpositivo>
        <receptor>texto(200)</receptor>
        <domicilioreceptor>texto(300)</domicilioreceptor>
        <importetotal>num(13,2)</importetotal>
        <formaspago>
          <formapago>
            <codigo>num(2)</codigo>
            <descripcion>texto(50)</descripcion>
          </formapago>
        </formaspago>
        <incoterms>texto(3)</incoterms>
        <detalleincoterms>texto(20)</detalleincoterms>
        <otrosdatoscomerciales>texto(1000)</otrosdatoscomerciales>
        <permisosdestinos>
          <permisodestino>
            <permisoemb>texto(16)</permisoemb>
            <destino>num(3)</destino>
          </permisodestino>
        </permisosdestinos>
        <cmpasociados>
          <cmpasociado>
            <tipoasoc>num(2)</tipoasoc>
            <ptovtaasoc>num(4)</ptovtaasoc>
            <nroasoc>num(8)</nroasoc>
          </cmpasociado>
        </cmpasociados>
        <detalles>
          <detalle>
            <cod>texto(50)</cod>
            <desc>texto(4000)</desc>
            <unimed>num(2)</unimed>
            <cant>num(10,2)</cant>
            <preciounit>num(13,2)</preciounit>
            <importe>num(13,2)</importe>
          </detalle>
        </detalles>
        <otrosdatosgenerales>texto(1000)</otrosdatosgenerales>
      </comprobante>
    </comprobantes>
    
    
    saludos
    programador
    Monday, August 02, 2010 6:02 PM

Answers

  • hola

    no te animas a usar linq to xml ?

     

    y hacer algo como esto

    Imports System.Xml.Linq


    Public Class Form1

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



            Dim xmldoc As XElement = <comprobantes></comprobantes>

            Dim compronante As XElement = New XElement("comprobante")

            Dim tipo As XElement = New XElement("tipo")
            tipo.Value = "num(2)"

            compronante.Add(tipo)

            xmldoc.Add(compronante)

            Dim xmlfinal As String = xmldoc.ToString()


        End Sub

    End Class

     

    por supuesto esto es una muestra, falta completarlo, pero en el ejmeplo va encaminado



    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Proposed as answer by chisigo Tuesday, August 03, 2010 8:13 AM
    • Marked as answer by rodrigo barboni Wednesday, August 04, 2010 1:03 PM
    Monday, August 02, 2010 7:58 PM
  • una vez que tienes el dataset creado, yo opino que la manera más rápida de generar un xml es usar WriteXML.

     

    Revisa este link para más detalles: http://msdn.microsoft.com/es-es/library/zx8h06sz%28v=VS.80%29.aspx

     

    Salu2


    nunca te acostarás sin saber una cosa más
    Tuesday, August 03, 2010 5:12 AM
  • hola

    habia puesto un ejemplo justamente cuando hice

            Dim compronante As XElement = New XElement("comprobante")

            Dim tipo As XElement = New XElement("tipo")
            tipo.Value = "num(2)"

            compronante.Add(tipo)

    como veras compronante es el padre de tipo

    veras como en la instancia de compronant uso el compronante.Add()

    es alli como agregas y armas la herarquia de nodos, un nodo se va agregando a otro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Thursday, August 05, 2010 12:18 PM

All replies

  • hola

    no te animas a usar linq to xml ?

     

    y hacer algo como esto

    Imports System.Xml.Linq


    Public Class Form1

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



            Dim xmldoc As XElement = <comprobantes></comprobantes>

            Dim compronante As XElement = New XElement("comprobante")

            Dim tipo As XElement = New XElement("tipo")
            tipo.Value = "num(2)"

            compronante.Add(tipo)

            xmldoc.Add(compronante)

            Dim xmlfinal As String = xmldoc.ToString()


        End Sub

    End Class

     

    por supuesto esto es una muestra, falta completarlo, pero en el ejmeplo va encaminado



    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Proposed as answer by chisigo Tuesday, August 03, 2010 8:13 AM
    • Marked as answer by rodrigo barboni Wednesday, August 04, 2010 1:03 PM
    Monday, August 02, 2010 7:58 PM
  • una vez que tienes el dataset creado, yo opino que la manera más rápida de generar un xml es usar WriteXML.

     

    Revisa este link para más detalles: http://msdn.microsoft.com/es-es/library/zx8h06sz%28v=VS.80%29.aspx

     

    Salu2


    nunca te acostarás sin saber una cosa más
    Tuesday, August 03, 2010 5:12 AM
  • hola leandro escribi una clase como esta pero tengo problemas para cerrar los nodos:

    esta es la clase:

    Imports System.Xml
    Imports System.IO
    Public Class crearxml
      Public Sub GrabarComprobantes(ByVal pDataSetCom As Comprobantes)
        'comienzo el grabado dle documento
        Dim escritor As New XmlTextWriter("C:\facexpo\rodrigo.xml", Nothing)
        Me.crearDoc(escritor)
        'escribo el nodo comprobantes
        Me.escribirNodoComprobantes(escritor)
    
        'recorro las cabecera de comprobantes
        For Each pFil As Comprobantes.cabeceraRow In pDataSetCom.cabecera.Rows
          'por cada cabecera grabo la cabecera 
          Dim pCabecera As New Cabecera
          pCabecera.idsolicitud = pFil.idsolicitud
          pCabecera.ptovta = pFil.ptovta
          pCabecera.tipo = pFil.tipo
          Me.escribirNodoCabecera(escritor, pCabecera)
          'por cada detalle del comprobante grabo en el xml
          If pDataSetCom.detalle.Count > 0 Then
            'si es un detalle del comprobante lo grabo como un subnodo en el xml
            Me.escribirNodoDetalles(escritor)
            For Each pfilDet As Comprobantes.detalleRow In pDataSetCom.detalle
              If pFil.idsolicitud = pfilDet.idsolicitud Then
                Dim pDetalle As New detalle
                pDetalle.idsolicitud = pfilDet.idsolicitud
                pDetalle.cod = pfilDet.cod
                pDetalle.desc = pfilDet.desc
                Me.escribirNodoDetalle(escritor, pDetalle)
              End If
            Next
          End If
          'cierro la cabecera
    
    
        Next
        Me.cerrarNodoComprobantes(escritor)
      End Sub
      'Public Function crearDetalle(ByVal pDataSetCom As Comprobantes) As detalle
      '  Dim pDetalle As New detalle
      '  pDetalle.idsolicitud=
      '  pDetalle.cod =
      '  pDetalle.desc =
    
    
      'End Function
      Public Sub crearDoc(ByRef escritor As XmlTextWriter)
        MessageBox.Show("CREANDO XML")
        'En este caso creamos el escritor xml
        'Le damos formato
        escritor.Formatting = Formatting.Indented
        'Nodo Root 
        escritor.WriteStartDocument()
      End Sub
      Public Sub escribirNodoComprobantes(ByRef escritor As XmlTextWriter)
        escritor.WriteStartElement("Comprobantes")
      End Sub
      Public Sub cerrarNodoComprobantes(ByRef escritor As XmlTextWriter)
        escritor.WriteFullEndElement()
        'Cerramos el escritor
        escritor.Close()
      End Sub
      Public Sub escribirNodoCabecera(ByRef escritor As XmlTextWriter, ByVal pfila As Cabecera)
        'Y asi sucesivamente creamos los subnodos
        escritor.WriteStartElement("Comprobante")
        escritor.WriteAttributeString("idsolicitud", pfila.idsolicitud)
        escritor.WriteElementString("tipo", pfila.tipo)
        escritor.WriteElementString("ptovta", pfila.ptovta)
        'No olvidar nunca de poner cuando termina un elemento
        escritor.WriteEndElement()
      End Sub
    
      'detalles
    
      Public Sub escribirNodoDetalles(ByRef escritor As XmlTextWriter)
        'escribe el subnodo detalles
        escritor.WriteStartElement("Detalles")
      End Sub
      Public Sub escribirNodoDetalle(ByRef escritor As XmlTextWriter, ByVal pfila As detalle)
        'Y asi sucesivamente creamos los subnodos
        escritor.WriteStartElement("Detalle")
        escritor.WriteAttributeString("idsolicitud", pfila.idsolicitud)
        escritor.WriteElementString("cod", pfila.cod)
        escritor.WriteElementString("desc", pfila.desc)
        'No olvidar nunca de poner cuando termina un elemento
        escritor.WriteEndElement()
      End Sub
    End Class
    
    

     

    asi queda el archivo generado y como debria salir:

     

    sali asi :
    <?xml version="1.0"?>
    <Comprobantes>
     <Comprobante idsolicitud="1">
      <tipo>1</tipo>
      <ptovta>1</ptovta>
     </Comprobante>
     <Detalles>
      <Detalle idsolicitud="1">
       <cod>e</cod>
       <desc>e</desc>
      </Detalle>
      <Detalle idsolicitud="1">
       <cod>e</cod>
       <desc>e</desc>
      </Detalle>
      <Comprobante idsolicitud="3">
       <tipo>3</tipo>
       <ptovta>3</ptovta>
      </Comprobante>
      <Detalles>
       <Detalle idsolicitud="3">
        <cod>3</cod>
        <desc>3</desc>
       </Detalle>
      </Detalles>
     </Detalles>
    </Comprobantes>
    
    
    deberia quedar asi:
    <?xml version="1.0"?>
    <Comprobantes>
     <Comprobante idsolicitud="1">
      <tipo>1</tipo>
      <ptovta>1</ptovta>
     </Comprobante>
     <Detalles>
      <Detalle idsolicitud="1">
       <cod>e</cod>
       <desc>e</desc>
      </Detalle>
      <Detalle idsolicitud="1">
       <cod>e</cod>
       <desc>e</desc>
      </Detalle>
     </Detalles>
     <Comprobante idsolicitud="3">
       <tipo>3</tipo>
       <ptovta>3</ptovta>
      </Comprobante>
      <Detalles>
       <Detalle idsolicitud="3">
        <cod>3</cod>
        <desc>3</desc>
       </Detalle>
      </Detalles>	
    </Comprobantes>
    

    programador
    Wednesday, August 04, 2010 1:49 PM

  • recuerda quelos nodos hijos debes agregarlos a la instancias del padre que los contiene

    cuando creas detalle este deberia agregarse al la instancia del nodo comprobante,

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Wednesday, August 04, 2010 3:53 PM
  • hola leandro, no tenes un ejemplo chiquito para ver como agregar un nodo  hijo a la instancia del padre, gracias
    programador
    Thursday, August 05, 2010 12:13 PM
  • hola

    habia puesto un ejemplo justamente cuando hice

            Dim compronante As XElement = New XElement("comprobante")

            Dim tipo As XElement = New XElement("tipo")
            tipo.Value = "num(2)"

            compronante.Add(tipo)

    como veras compronante es el padre de tipo

    veras como en la instancia de compronant uso el compronante.Add()

    es alli como agregas y armas la herarquia de nodos, un nodo se va agregando a otro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Thursday, August 05, 2010 12:18 PM