none
Crear XML en memoria y convertirlo en base 64 RRS feed

  • Pregunta

  • Hola amigos, tengo que crear un xml y convertirlo en base64, mi duda es como puedo trabajar con el xml en memoria sin necesidad de tener que crear el archivo en el disco duro para luego leerlo y obtener su contenido para convertirlo enbase64

    Estoy usando el siguiente metodo

     using (XmlTextWriter Wr = new XmlTextWriter(nombreArchivoXml, Encoding.UTF8))
                                    {
                                        Wr.Formatting = System.Xml.Formatting.Indented;
                                        Wr.WriteStartDocument();
                                        Wr.WriteStartElement("Documento");
                                        Wr.WriteAttributeString("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#");
                                        Wr.WriteAttributeString("xmlns:dte", "http://www.sat.gob.gt/dte/fel/0.1.0");
    ...
    ...
    ...
    }//fin del using para crear el xml


    Luego que se genera el archivo en el disco uso lo siguiente

     new FileStream(nombreArchivoXml, FileMode.Open, FileAccess.Read, FileShare.Read).Close();
                                    StreamReader streamReader = new StreamReader(nombreArchivoXml);
                                    string contenidoArchivo = streamReader.ReadToEnd();
                                    streamReader.Close();

    Y ahi ya tengo en la variable contenidoArchivo el xml que forma, la idea seria tenerla en memoria dentro del primer metodo y evitar tener que escribir a un archivo en el disco.

    No se si alguien me puede indicar como obtener el contenido del archivo xml desde la clase XmlTextWriter

    gracias por su ayuda

    viernes, 3 de mayo de 2019 16:37

Respuestas

  • hola

    podrias usar un archivo en memoria con el MemoryStream

    string contenido = "";

    using (var ms = new MemoryStream()) using (XmlTextWriter Wr = new XmlTextWriter(ms, Encoding.UTF8)){

    //codigo

    string contenido = Encoding.UTF8.GetString(ms.ToArray());

    }



    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Fsigu viernes, 3 de mayo de 2019 21:42
    viernes, 3 de mayo de 2019 19:25

Todas las respuestas

  • hola

    podrias usar un archivo en memoria con el MemoryStream

    string contenido = "";

    using (var ms = new MemoryStream()) using (XmlTextWriter Wr = new XmlTextWriter(ms, Encoding.UTF8)){

    //codigo

    string contenido = Encoding.UTF8.GetString(ms.ToArray());

    }



    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Fsigu viernes, 3 de mayo de 2019 21:42
    viernes, 3 de mayo de 2019 19:25
  • Gracias Leandro por tu ayuda funciono pero de forma parcial, cuando generaba el xml a un archivo en el disco me escribia todo contenido del xml en el arxhivo, por ejemplo el final del archivo es algo asi

      <dte:Item BienOServicio="B" NumeroLinea="7">
              <dte:Cantidad>33.00</dte:Cantidad>
              <dte:UnidadMedida>LTS</dte:UnidadMedida>
              <dte:Descripcion>IL:IL9003.0100-Newmectin 1.8 EC 100 cc</dte:Descripcion>
              <dte:PrecioUnitario>139.6518</dte:PrecioUnitario>
              <dte:Precio>4608.51</dte:Precio>
              <dte:Descuento>0.0000</dte:Descuento>
              <dte:Impuestos>
                <dte:Impuesto>
                  <dte:NombreCorto>IVA</dte:NombreCorto>
                  <dte:CodigoUnidadGravable>1</dte:CodigoUnidadGravable>
                  <dte:MontoGravable>4608.51</dte:MontoGravable>
                  <dte:MontoImpuesto>0.0000</dte:MontoImpuesto>
                </dte:Impuesto>
              </dte:Impuestos>
              <dte:Total>5161.5307</dte:Total>
            </dte:Item>
          </dte:Items>
          <dte:Totales>
            <dte:TotalImpuestos>
              <dte:TotalImpuesto NombreCorto="IVA" TotalMontoImpuesto="1820.41" />
            </dte:TotalImpuestos>
            <dte:GranTotal>1820.41</dte:GranTotal>
          </dte:Totales>
        </dte:DatosEmision>
      </dte:SAT>
    </dte:GTDocumento>

    Al usar tu recomencacion y al ejecutar esta linea

    contenidoXML = Encoding.UTF8.GetString(xmlMemoria.ToArray());

    En la variable contenidoXML, me corta caracteres al final solo llega hasta aqui

     <dte:Item BienOServicio="B" NumeroLinea="7">
              <dte:Cantidad>33.00</dte:Cantidad>
              <dte:UnidadMedida>LTS</dte:UnidadMedida>
              <dte:Descripcion>IL:IL9003.0100-Newmectin 1.8 EC 100 cc</dte:Descripcion>
              <dte:PrecioUnitario>139.6518</dte:PrecioUnitario>
              <dte:Precio>4608.51</dte:Precio>
              <dte:Descuento>0.0000</dte:Descuento>
              <dte:Impuestos>
                <dte:Impuesto>
                  <dte:NombreCorto>IVA</dte:

    Me corta las ultimas 16 lineas mas o menos,

    No se si el MemoryStream tiene algun limite de caracteres??

    viernes, 3 de mayo de 2019 22:08
  • hola

    no, no hay ningun limite

    como visualizas la variable? la has puesto en algun control para ver su contenido o detienes el codigo he inspeccionas

    si tienes el ToArray() podrias usar el File.WriteAllBytes() y generar un archivo a ver como resulta, asi no lo conviertes a string y se valida si esa conversion no genera el corte, aunque es raro

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de mayo de 2019 23:05
  • Hola Leandro, si la verdad si lo detengo justo en esa linea con uin breakpoint y lo reviso pero lo solucione, cuando me generaba el error tenia el codigo asi.

    string contenido = "";
    using (var ms = new MemoryStream())
    {
    using (XmlTextWriter Wr = new XmlTextWriter(ms, Encoding.UTF8))
    {
        //codigo
    
       string contenido = Encoding.UTF8.GetString(ms.ToArray());
    
    }//foreach xmltextweriter
    }//foreach MemoryStream
    
    

    y lo he solucionado sacando el strin del primer using asi

    string contenido = "";
    using (var ms = new MemoryStream())
    {
    using (XmlTextWriter Wr = new XmlTextWriter(ms, Encoding.UTF8))
    {
        //codigo
    
    }//foreach xmltextweriter
    
    string contenido = Encoding.UTF8.GetString(ms.ToArray());
    
    }//foreach MemoryStream

    Gracias por la ayuda

    viernes, 3 de mayo de 2019 23:52
  • hola, amigo, 

    estoy en el mismo problema, estoy creando un archivo xml a partir de xsd, ya he creado la clase xsd, y tengo los objectos, pero meda error al querere asociarlos, al objeto padre, veo que es lo mismo lo que estamos trabajando, haber si me hechas una mano indicandome como terminaste generandolo. 

    gracias 

    viernes, 27 de marzo de 2020 4:51