Codificar y Decodificar String en Base64 sin rutinas Javascript

Hola tyros!!

Desde siempre he sido de la idea de crear mis propias rutinas de código o utilizar existentes de código abierto. Una necesidad básica de cualquier desarrollador web es convertir cadenas de texto en formato Base64. La necesidad se va a presentar, las razones de la necesidad pueden variar, pero tarde o temprano siempre nos vemos orillados a ello.

Algunas de las razones que se me ocurren, pueden detonar la necesidad son las siguientes:

  • Ocultar parámetros GET o POST a la vista haciéndolos ilegibles.
  • Poder enviar algunos caracteres especiales que podrían afectar envíos via GET
  • Se ve cool

Pues bien, sucede que en internet hay muchas rutinas Javascript que prometen Codificar y decodificar cadenas de texto en Base64. No pretendo desacreditar a nadie, simplemente que hoy siendo 26 de Noviembre del 2019 y desde hace ya algo de tiempo, tenemos una forma corta de hacer este trabajo.

No quiero robarme los créditos originales de este tema, así que solo voy a mencionarlo y les dejo el enlace para que puedan ver la documentación original.

Sin mas...

Codificar:


window.btoa("texto a codificar");


Decodificar:


window.btoa("dGV4dG8gYSBjb2RpZmljYXI=");


Para mas detalles, visita el siguiente enlace:

Base64 codificando y decodificando

Leer nodos XML Factura Electronica

Hola tyros!, hoy quiero compartirles la forma que utilizo para leer los nodos de un XML; específicamente el XML de la factura electrónica 3.3 del SAT México.

Para este ejemplo vamos a leer varios datos del XML, como son


  • Folio
  • Serie
  • Sub Total
  • Total

Luego leeremos, también, el nodo "Impuestos" con todo su contenido.

En este ejemplo asumiremos que el XML contiene todos los elementos que estamos buscando, en caso de que tu XML no los contenga, haz las adaptaciones necesarias para evitar errores relacionados con datos nulos.

Comencemos cargando el XML:

XmlDocument doc = new XmlDocument();
doc.Load(xml);//Leer el XML


Luego, requerimos agregar un manejador de "namespaces", esto nos permitirá acceder a los nodos con el prefijo "cfdi"

//agregamos un Namespace, que usaremos para buscar que el nodo no exista:
XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("cfdi", "http://www.sat.gob.mx/cfd/3");


El siguiente paso es acceder al nodo "Comprobante", para poder obtener los valores de sus atributos


//Accedemos a nodo "Comprobante"
XmlNode nodeComprobante = doc.SelectSingleNode("//cfdi:Comprobante", nsm);


A continuacion, obtenemos los valores que necesitamos:

//Obtener Folio, Serie, SubTotal y Total
string varFolio = nodeComprobante.Attributes["Folio"].Value;
string varSerie = nodeComprobante.Attributes["Serie"].Value;
string varSubTotal = nodeComprobante.Attributes["SubTotal"].Value;
string varTotal = nodeComprobante.Attributes["Total"].Value;
Response.Write(String.Format("Serie: {0}, Folio: {1}, SubTotal: {2}, Total: {3}", varSerie, varFolio, varSubTotal, varTotal));


Ahora vamos a obtener el nodo "Impuestos" con todo su contenido incluido. Para hacemos lo siguiente:


//Obtener impuestos
XmlNode nodeImpuestos = nodeComprobante.SelectSingleNode("cfdi:Impuestos", nsm);


Ahora obtenemos los totales de los impuestos:

//Obtenemos TotalImpuestosRetenidos y TotalImpuestosTrasladados
string varTotalImpuestosRetenidos = nodeImpuestos.Attributes["TotalImpuestosRetenidos"].Value;
string varTotalImpuestosTrasladados = nodeImpuestos.Attributes["TotalImpuestosTrasladados"].Value;


Para la siguiente parte utilizaremos bucles/ciclos para leer la información.

Veamos la parte de las retenciones y los traslados:

//Obtener impuestos retenidos
Response.Write("Retenciones: <br />");
XmlNode nodeImpuestosRetenciones = nodeImpuestos.SelectSingleNode("cfdi:Retenciones", nsm);
    foreach (XmlNode node in nodeImpuestosRetenciones.SelectNodes("cfdi:Retencion", nsm)) {
    Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
                                    node.Attributes["Impuesto"].Value,
                                    node.Attributes["Importe"].Value));
}

//Obtener impuestos trasladados
Response.Write("Traslados: <br />");
XmlNode nodeImpuestosTraslados = nodeImpuestos.SelectSingleNode("cfdi:Traslados", nsm);
foreach (XmlNode node in nodeImpuestosTraslados.SelectNodes("cfdi:Traslado", nsm))
{
    Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
                                    node.Attributes["Impuesto"].Value,
                                    node.Attributes["Importe"].Value));
}


Esto seria todo, por si las dudas, aquí les dejo el código completo:

//Factura
XmlDocument doc = new XmlDocument();
doc.Load(xml);//Leer el XML

//agregamos un Namespace, que usaremos para buscar que el nodo no exista:
XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("cfdi", "http://www.sat.gob.mx/cfd/3");

//Accedemos a nodo "Comprobante"
XmlNode nodeComprobante = doc.SelectSingleNode("//cfdi:Comprobante", nsm);

//Obtener Folio, Serie, SubTotal y Total
string varFolio = nodeComprobante.Attributes["Folio"].Value;
string varSerie = nodeComprobante.Attributes["Serie"].Value;
string varSubTotal = nodeComprobante.Attributes["SubTotal"].Value;
string varTotal = nodeComprobante.Attributes["Total"].Value;
Response.Write(String.Format("Serie: {0}, Folio: {1}, SubTotal: {2}, Total: {3}", varSerie, varFolio, varSubTotal, varTotal));

//Obtener impuestos
XmlNode nodeImpuestos = nodeComprobante.SelectSingleNode("cfdi:Impuestos", nsm);
//Obtenemos TotalImpuestosRetenidos y TotalImpuestosTrasladados
string varTotalImpuestosRetenidos = nodeImpuestos.Attributes["TotalImpuestosRetenidos"].Value;
string varTotalImpuestosTrasladados = nodeImpuestos.Attributes["TotalImpuestosTrasladados"].Value;

//Obtener impuestos retenidos
Response.Write("Retenciones: <br />");
XmlNode nodeImpuestosRetenciones = nodeImpuestos.SelectSingleNode("cfdi:Retenciones", nsm);
    foreach (XmlNode node in nodeImpuestosRetenciones.SelectNodes("cfdi:Retencion", nsm)) {
    Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
                                    node.Attributes["Impuesto"].Value,
                                    node.Attributes["Importe"].Value));
}

//Obtener impuestos trasladados
Response.Write("Traslados: <br />");
XmlNode nodeImpuestosTraslados = nodeImpuestos.SelectSingleNode("cfdi:Traslados", nsm);
foreach (XmlNode node in nodeImpuestosTraslados.SelectNodes("cfdi:Traslado", nsm))
{
    Response.Write(String.Format("Impuesto: {0}, Importe: {1} <br />",
                                    node.Attributes["Impuesto"].Value,
                                    node.Attributes["Importe"].Value));
}


Espero que les sea de utilidad. Saludos!