Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Leer factura XML y extraer los conceptos (cfdi:conceptos)

Estas en el tema de Leer factura XML y extraer los conceptos (cfdi:conceptos) en el foro de .NET en Foros del Web. Hola amigos, estoy atorado tratando de leer los CFDI:CONCEPTOS de varios xml. Son varias facturas (xml) que tengo que verificar que el valorUnitario sea el ...
  #1 (permalink)  
Antiguo 08/07/2016, 01:46
 
Fecha de Ingreso: abril-2016
Ubicación: chiapas
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Leer factura XML y extraer los conceptos (cfdi:conceptos)

Hola amigos, estoy atorado tratando de leer los CFDI:CONCEPTOS de varios xml. Son varias facturas (xml) que tengo que verificar que el valorUnitario sea el correcto segun el NoDescripcion. Pero tengo problema al tratar de contar cuantos conceptos contiene e iniciar un ciclo para leerlos.

-<cfdi:Conceptos>

<cfdi:Concepto importe="646425.00" valorUnitario="13.00" descripcion="GLUCOSA SERICA Y PARA LIQUIDOS ORGANICOS UNIDAD : PRUEBAS<br>" noIdentificacion="a023" unidad="SR" cantidad="49725.0000"/>
<cfdi:Concepto importe="604825.00" valorUnitario="13.00" descripcion="UREA SERICA Y URINARIA UNIDAD : PRUEBAS<br>" noIdentificacion="b345" unidad="SR" cantidad="46525.0000"/>
<cfdi:Concepto importe="660725.00" valorUnitario="13.00" descripcion="CREATININA SERICA Y URINARIA. UNIDAD : PRUEBAS<br>" noIdentificacion="b234" unidad="SR" cantidad="50825.0000"/>
<cfdi:Concepto importe="476450.00" valorUnitario="13.00" descripcion="ACIDO URICO SERICA Y URINARIA. UNIDAD : PRUEBAS<br>" noIdentificacion="b178" unidad="SR" cantidad="36650.0000"/>
<cfdi:Concepto importe="438425.00" valorUnitario="13.00" descripcion="COLESTEROL PRUEBAS UNIDAD : PRUEBAS<br>" noIdentificacion="b084" unidad="SR" cantidad="33725.0000"/>

</cfdi:Conceptos>


Este es mi código donde no he podido contar cuantos conceptos son, y tampoco declarar el ciclo para extraer los datos.

Imports System.Xml

try
Dim mValorUnitario as Decimal
Dim mNoIdentificacion as String
Dim m_xmld As New System.Xml.XmlDocument
Dim m_nodelist As System.Xml.XmlNodeList
Dim m_node As System.Xml.XmlNode
m_xmld = New XmlDocument()
m_xmld.Load("C:\XML\invoice.xml")
m_nodelist = m_xmld.ChildNodes()
For Each m_node In m_nodelist
Dim mValorUnitario = m_node.Attributes.GetNamedItem("cfdi:conceptos").C hildNodes(0).Attributes.GetNamedItem("valorUnitari o").Value
Dim mNoIdentificacion = m_node.Attributes.GetNamedItem("cfdi:conceptos").C hildNodes(0).Attributes.GetNamedItem("noIdentifica cion").Value

'aquí insertaría un código para validar con la base de datos
Next
Catch ex As Exception
End try


Les agradezco la ayuda de antemano. Saludos
  #2 (permalink)  
Antiguo 08/07/2016, 15:19
Avatar de Namiwis  
Fecha de Ingreso: mayo-2013
Ubicación: Crustaceo Cascarudo
Mensajes: 162
Antigüedad: 10 años, 11 meses
Puntos: 10
Respuesta: Leer factura XML y extraer los conceptos (cfdi:conceptos)

Hola angel_MR

Lo puedes hacer mediante LinQ

Para moverte entre nodos, debes declarar los namespaces del XML en cuestion

Código VB:
Ver original
  1. Dim nsCFDi As XNamespace = "http://www.sat.gob.mx/cfd/3"

Cargas tu archivo fisico XML en un XDocument

Código VB:
Ver original
  1. Dim archivoXML As XDocument = XDocument.Load("Ruta de tu archivo")

Entonces, lees lo que busques.. en este caso la cantidad de Conceptos

Código VB:
Ver original
  1. Dim CantidadConceptos As Integer = archivoXML.Descendants(nsCFDi + "Comprobante").Elements(nsCFDi + "Conceptos").Elements().Count()

Editalo un poco y adaptalo para leer el total, ya tienes la base :)

Saludos
__________________
http://binarysuns.com.mx/
  #3 (permalink)  
Antiguo 10/07/2016, 01:01
 
Fecha de Ingreso: abril-2016
Ubicación: chiapas
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Respuesta: Leer factura XML y extraer los conceptos (cfdi:conceptos)

Muchas gracias Namiwis, tu respuesta me fue de gran ayuda, después de tanto batallar por fin puedo recorrer cualquier elemento de cualquier nodo de los conceptos de cualquier Factura XML.

Tan sencillo como esto: (Codigo VB)

Cita:
Dim nsCFDi As XNamespace = "http://www.sat.gob.mx/cfd/3" 'para que pueda identificar el prefijo CFDI
Dim archivoXML As XDocument = XDocument.Load("C:\XML\books.xml") 'selecciona y abre la factura electrónica xml
Dim importe As Integer = 0 'contador para saber cuantos conceptos tiene la factura
For Each lconcepto As XElement In archivoXML.Descendants(nsCFDi + "Comprobante").Elements(nsCFDi + "Conceptos").Elements() 'ciclo que recorre todos los conceptos de la factura
Dim Name As String = lconcepto.Attribute("descripcion").Value 'obtiene el valor de la descripción para darle tratamiento posterior
importe = importe + 1
Next
MsgBox(importe & " descripciones") 'imprime cuantos conceptos encontro

Última edición por angel_MR; 10/07/2016 a las 01:07
  #4 (permalink)  
Antiguo 12/08/2016, 13:27
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Leer factura XML y extraer los conceptos (cfdi:conceptos)

Si quieres obtener cada uno de los datos puedes usar ésta clase

CFDI32.cs (la adjunto)


Y le puedes pasar el XMl en formato bytes[] y al funcion quedaría:

Código C++:
Ver original
  1. public static Comprobante ReadCFDI(byte[] bytes)
  2.         {
  3.  
  4.             XmlSerializer serial = new XmlSerializer(typeof(Comprobante));
  5.             Comprobante ds = new Comprobante();
  6.             Stream stream = new MemoryStream(bytes);
  7.  
  8.             ds = (Comprobante)serial.Deserialize(stream);
  9.  
  10.             return ds;
  11.         }
Y para llamarlo

Comprobante resultXML = ReadCFDI(documentBytes);
ComprobanteConcepto[] conceptos = resultXML.Conceptos;
...
resultXML.Emisor.rfc
..

Salu2
Archivos Adjuntos
Tipo de Archivo: txt CFDI32.cs.txt (36,8 KB (Kilobytes), 5 visitas)
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net

Etiquetas: net
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:30.