Página 1 de 1
Como selecciono un nodo en el XML ????
Publicado: Mar Oct 16, 2012 12:15 pm
por Halcon Divino
Que t al colegas
Lo que requiero es seleccionar el NODO Complemento del XML
Pero no puedo hacerlo , este es el codigo que estoy usando en c# para seleccionar el nodo.
Me da null la variable NodoComplemento .... Que estoy haciendo mal ???????
Saludos
string ArchivoXML = @"C:\CFDI_XYZ.XML";
XmlDocument oXml = new XmlDocument();
oXml.Load(ArchivoXML);
//Obtenemos el nodo raiz del documento.
XmlNode nodoRaiz = oXml.DocumentElement;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(oXml.NameTable);
nsmgr.AddNamespace("cfdi", "
www.sat.gob.mx/cfd/3");
XmlNode NodoComplemento = oXml.SelectSingleNode("//cfdi:Comprobante/cfdi:Complemento", nsmgr);
Re: Como selecciono un nodo en el XML ????
Publicado: Mar Oct 16, 2012 3:34 pm
por alf
No se que quieras hacer, pero yo hago lo siguiente:
XmlDocument xmlFactura = new XmlDocument();
xmlFactura.Load(Server.MapPath("../xml_facturas" + "/" + strFact));
XmlNodeList xmlComprobante = xmlFactura.GetElementsByTagName("cfdi:Comprobante");
y xmlComprobante[0] es el nodo comprobante...
No se si esto te ayude...
Re: Como selecciono un nodo en el XML ????
Publicado: Mar Oct 16, 2012 4:46 pm
por Halcon Divino
Alf
Gracias por tu respuesta
El """.GetElementsByTagName""" ya lo he usado para extractar datos puntuales del XML y me ha funcionado correctamente
Requiero seleccionar el nodo COMPLEMENTO para posteriormente insertar otro nodo .... pero sino puedo hacer el SELECTNODE menos voy a poder insertar el nodo que quiero.
Si alguien me podría apoyar se los agradecería
Saludos
Halcón Divino
Monterrey, N.L. Mex.
.
.
Re: Como selecciono un nodo en el XML ????
Publicado: Jue Oct 18, 2012 2:27 pm
por alf
Pues creas el nodo que vas a agregar
XmlDocument xmlFactura = new XmlDocument();
xmlFactura.Load(Server.MapPath("../xml_facturas" + "/" + strFact));
XmlNodeList xmlComprobante = xmlFactura.GetElementsByTagName("cfdi:Comprobante");
//Creas el nodo hijo
XmlNode nodoHijo = xmlFactura.CreateElement("Hijo");
nodoHijo.InnerText = "Este es el texto del hijo";
//Y lo agregas al nodo padre
xmlComprobante[0].AppendChild(nodoHijo);
Y listo... ya tienes un nodo hijo dentro del nodo padre...
Pero si estás creando la factura electrónica, te recomendaría usar serializacion, usando el schema que ya da el SAT y el XML se genera automáticamente sin necesidad de estar creando nodos...
Re: Como selecciono un nodo en el XML ????
Publicado: Jue Oct 18, 2012 2:57 pm
por alf
A lo mejor no es lo que quieres pero así puedes generar el CFDI 3.2 (antes de Timbrarlo) usando Visual Studio 2010 con serialización:
1. Bajas el esquema del CFDI 3.2 de la pagina del SAT, el cfdv32.xsd
2. Abres un ventana de Visual Studio Command Prompt (2010)
3. Te vas al directorio donde pusiste el archivo xsd y ejecutas el siguiente comando:
D:\Projects\dll\Xslt>xsd cfdv32.xsd /classes
4. Y te genera un archivo llamado cfdv32.cs, que es la clase Comprobante
5. Esa clase la agregas a tu proyecto, y le agregas lo siguiente (yo lo puse depués de que los atributos son declarados):
[XmlAttribute(Namespace = XmlSchema.InstanceNamespace)]
public string schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd";
6. Y ahora si, creas una instancia de la clase Comprobante y la llenas con los datos:
Comprobante objCompXSD = new Comprobante();
objCompXSD.version = "3.2";
objCompXSD.fecha = DateTime.Now;
....
7. Y ahora hace la serializacion
// Creas los namespaces requeridos
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3");
// Creas una instancia de XMLSerializer con el tipo de dato Comprobante
XmlSerializer xmlSerialize = new XmlSerializer(typeof(Comprobante));
// Creas una instancia de XmlTextWriter donde se va a guardar el resultado de la serialización
XmlTextWriter xmlTextWriter = new XmlTextWriter(@"factura.xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
// Y serializas...
xmlSerialize.Serialize(xmlTextWriter, objCompXSD, xmlNameSpace);
xmlTextWriter.Close();
8. Y listo, el .NET te va a generar el XML con el formato que requiere el SAT (antes de timbrar)...
9. Y con este XML puedes generar la cadena original usando Transformación (cadenaoriginal_3_2.xslt) para finalmente generar el sello antes de mandarla timbrar con el PAC.
Re: Como selecciono un nodo en el XML ????
Publicado: Sab Dic 01, 2012 8:38 pm
por jerryeagle
No sabia si responder a un post de hace tanto tiempo pero... con LinQ es facilísimo:
Para seleccionar el Nodo Complemento (Raiz):
Con VB
Dim xComprobante As XElement = XDocument.Load("Archivo.xml").Root
Para Agregar un nodo
Dim xEmisor As XElement = <Emisor
rfc="AUBG780220IQZ"
nombre="NOMBRE O RAZON SOCIAL" />
xComprobante.Add(xEmisor)
Para Seleccionar el Nodo Emisor
Dim NodoEmisor As XElement = xComprobante.Root.<Emisor>
etc...
Re: Como selecciono un nodo en el XML ????
Publicado: Vie Ene 24, 2014 10:25 am
por rudolf cruz
alf escribió:A lo mejor no es lo que quieres pero así puedes generar el CFDI 3.2 (antes de Timbrarlo) usando Visual Studio 2010 con serialización:
1. Bajas el esquema del CFDI 3.2 de la pagina del SAT, el cfdv32.xsd
2. Abres un ventana de Visual Studio Command Prompt (2010)
3. Te vas al directorio donde pusiste el archivo xsd y ejecutas el siguiente comando:
D:\Projects\dll\Xslt>xsd cfdv32.xsd /classes
4. Y te genera un archivo llamado cfdv32.cs, que es la clase Comprobante
5. Esa clase la agregas a tu proyecto, y le agregas lo siguiente (yo lo puse depués de que los atributos son declarados):
[XmlAttribute(Namespace = XmlSchema.InstanceNamespace)]
public string schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd";
6. Y ahora si, creas una instancia de la clase Comprobante y la llenas con los datos:
Comprobante objCompXSD = new Comprobante();
objCompXSD.version = "3.2";
objCompXSD.fecha = DateTime.Now;
....
7. Y ahora hace la serializacion
// Creas los namespaces requeridos
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3");
// Creas una instancia de XMLSerializer con el tipo de dato Comprobante
XmlSerializer xmlSerialize = new XmlSerializer(typeof(Comprobante));
// Creas una instancia de XmlTextWriter donde se va a guardar el resultado de la serialización
XmlTextWriter xmlTextWriter = new XmlTextWriter(@"factura.xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
// Y serializas...
xmlSerialize.Serialize(xmlTextWriter, objCompXSD, xmlNameSpace);
xmlTextWriter.Close();
8. Y listo, el .NET te va a generar el XML con el formato que requiere el SAT (antes de timbrar)...
9. Y con este XML puedes generar la cadena original usando Transformación (cadenaoriginal_3_2.xslt) para finalmente generar el sello antes de mandarla timbrar con el PAC.
hola compañero puedes detallar bien los pasos del 3 al 5 porfavor par ver como ejecutas el comando que mencionas para que genere la clase porfavor, Saludos...