none
Problema con Leer XML RRS feed

  • Pregunta

  • Buenas tardes, tengo un problema con leer archivos xml, ( ya he leido otros articulos en el foro pero no he encontrado la solucion) (son documento electronicos en chile

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DTE xmlns="http://www.sii.cl/SiiDte" version="1.0">
          <Documento ID="F4197935T33">
            <Encabezado>
              <IdDoc>
                <TipoDTE>33</TipoDTE>
                <Folio>4197935</Folio>
                <FchEmis>2017-08-26</FchEmis>
                <FchVenc>2017-09-25</FchVenc>
              </IdDoc>

    el archivo claramente continua, una solucion que he encontrado es abrir el archivo en un editor de xml y borrar el xmlns o colocarlo en "", asi

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DTE version="1.0">
          <Documento ID="F4197935T33">
            <Encabezado>
              <IdDoc>
                <TipoDTE>33</TipoDTE>
                <Folio>4197935</Folio>
                <FchEmis>2017-08-26</FchEmis>
                <FchVenc>2017-09-25</FchVenc>
              </IdDoc>

    y ahi si me funciona el codigo que he escrito para leer el archivo

     Dim oFileInfo As IO.FileInfo = Nothing
            Try
                Using oOpenFileDialog As New OpenFileDialog
                    oOpenFileDialog.Filter = "xml files (*.xml)|*.xml"
                    oOpenFileDialog.Multiselect = False

                    If oOpenFileDialog.ShowDialog(Me) = DialogResult.OK Then
                        If IO.File.Exists(oOpenFileDialog.FileName) Then
                            oFileInfo = New IO.FileInfo(oOpenFileDialog.FileName)
                        End If
                    End If
                End Using

                If oFileInfo IsNot Nothing Then
                    If IO.File.Exists(oFileInfo.FullName) Then
                        Dim documento As New XmlDocument()

                        documento.Load(oFileInfo.FullName)
                        XmlVB = True
                       
                        Dim IdDocList As XmlNodeList = documento.SelectNodes("/DTE/Documento/Encabezado/IdDoc")

                        For Each iddocl As XmlNode In IdDocList

                            TipoDte = iddocl.SelectSingleNode("TipoDTE").InnerText

                            Folio = iddocl.SelectSingleNode("Folio").InnerText
                            FchEmis = iddocl.SelectSingleNode("FchEmis").InnerText

                            If iddocl.SelectSingleNode("FmaPago") Is Nothing Then
                                FormaPago = String.Empty
                            Else
                                FormaPago = iddocl.SelectSingleNode("FmaPago").InnerText
                            End If

                            If iddocl.SelectSingleNode("FchVenc") Is Nothing Then
                                FchVenc = String.Empty
                            Else
                                FchVenc = iddocl.SelectSingleNode("FchVenc").InnerText
                            End If

                            Label2.Text = Folio
                            Label3.Text = "Fecha Emision " & FchEmis
                            Label4.Text = "Fecha Vencimiento " & FchVenc
                        Next

                  End If

    End if

    Cualquier ayuda lo agradecere, ya que no me es practico abrir y eliminar siempre lo del xmlns del XML

    Gracias

    • Cambiado Enrique M. Montejo miércoles, 13 de septiembre de 2017 8:22 Pregunta relacionada con Web Services.
    jueves, 7 de septiembre de 2017 16:46

Respuestas

  • Hola, si son documentos electrónicos de Chile debería haber un esquema cada oficial. He visto que está en este enlace http://www.sii.cl/factura_electronica/formato_xml.htm

    Bájate los esquemas y usa el programa xsd.exe que puedes usarlo con la consola de desarrollo de Visual Studio para generar las clases en tu lenguaje .net y usarlas. Deberías usar después la s técnicas de serialización y deserializacion. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 7 de septiembre de 2017 17:47

Todas las respuestas

  • AQUI VA LA MANERA MAS FACIL LA FORMA DE LEERLO POR LINEAS <?xml version="1.0" encoding="utf-8"?> <Variables> <Configuracion> <Dsn>basedatos1</Dsn> <Uid>root1</Uid> <Uid2>root</Uid2> </Configuracion> <xNodos> <Dsn>basedatos2</Dsn> <Uid>root2</Uid> </xNodos> </Variables> SUB.... Dim documento As New XmlDocument Dim nodo As XmlNode documento.Load("variables_sys.xml") For Each nodo In documento.DocumentElement.ChildNodes If nodo.Name = "Configuracion" Then Me.txt_1.Text = nodo.ChildNodes(0).InnerText 'DSN Me.txt_2.Text = nodo.ChildNodes(2).InnerText ELSE ... //QUIERES LEER MAS </xNodos>

    End If Next tu resultado seria: txt_1=BASEDATOS1 txt_2=ROOT END SUB...



    Pasa los puntos prro v:


    jueves, 7 de septiembre de 2017 17:31
  • Hola,

    Necesitas incluir el namespace:

    Dim nsmgr As XmlNamespaceManager

    nsmgr = New XmlNamespaceManager(documento.NameTable)
        nsmgr.AddNamespace(String.Empty, "http://www.sii.cl/SiiDte")

    Espero que te sirva.

    Saludos.


    jueves, 7 de septiembre de 2017 17:40
  •    Dim ruta As String = ""
            Dim xtr As New XmlTextReader("variables_sys.xml")
            If xtr.Read = True Then
                Do While xtr.Read
                    If xtr.NodeType = XmlNodeType.Element Then
                        Select Case xtr.Name
                            Case "Dsn"
                                xtr.Read()
                                If xtr.NodeType = XmlNodeType.Text Then
                                    txt1.text= xtr.Value
                                End If

                           Case "Uid2"
                                xtr.Read()
                                If xtr.NodeType = XmlNodeType.Text Then
                                    txt2.text= xtr.Value
                                End If

                        End Select
                    End If
                Loop
            End If
            xtr.Close() 'NO OLVIDES DE CERRAR TU XML DESPUES DE LEER
            Return ruta

    Bueno esto es otro método mas seguro ya que te ubica el nodo por valor y no por posición pero a cambio de la seguridad se demora mucho mas que obtenerlo por posición , con el método 1


    Pasa los puntos prro v:

    jueves, 7 de septiembre de 2017 17:46
  • Hola, si son documentos electrónicos de Chile debería haber un esquema cada oficial. He visto que está en este enlace http://www.sii.cl/factura_electronica/formato_xml.htm

    Bájate los esquemas y usa el programa xsd.exe que puedes usarlo con la consola de desarrollo de Visual Studio para generar las clases en tu lenguaje .net y usarlas. Deberías usar después la s técnicas de serialización y deserializacion. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 7 de septiembre de 2017 17:47
  • Try
                If MessageBox.Show(Me, "Confirma actualizar estos datos ?..", "Confirmación", MessageBoxButtons.YesNo, _
                MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) = Windows.Forms.DialogResult.Yes Then
                    Dim documento As New XmlDocument
                    Dim nodo As XmlNode
                    documento.Load("variables_sys.xml")
                    Dim idAlmacen1 As String = Me.txt_basesql.Text.Trim
                    For Each nodo In documento.DocumentElement.ChildNodes
                        If nodo.Name = "Configuracion" Then
                     
                            nodo.ChildNodes(0).InnerText = txt_1.Text.Trim 'NUEVO VALOR
             else .... //Actualizar mas nodos 
                        End If
                    Next
                    documento.Save("variables_sys.xml")
                    MsgBox("Se actualizó correctamente.", MsgBoxStyle.Information, "Informa")
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    Pasa los puntos prro v:


    jueves, 7 de septiembre de 2017 17:55
  • lo aplique , y no me funciono, igual no me muestra los datos

    Saludos, y gracias

    sábado, 9 de septiembre de 2017 16:54
  • por lo que me imagino deberia de ser el mejor procedimiento, para mi caso me falta todavia conocimiento para llegar a serializacion y deserializacion.

    a estudiar se ha dicho, Gracias

    sábado, 9 de septiembre de 2017 16:57
  • Hola, adapte tu codigo a un proyecto mio, lo que hice fue pasar el XML a un string y luego quitar  con replace lo que tu hacias de forma manual, te copio el código por si a alguien mas le sirve

     Try
                '#######$# CARGA XML !!!!!!!
                For Each row As DataRow In dt.Rows
                    '#######$# CARGA XML !!!!!!!
                    Dim stringXml As String = CStr(row("XML"))
    
                    Dim tipoDte, folio, fchEmis, formaPago, fchVenc, cadenaReempl, rznSoc As String
                    cadenaReempl = "xmlns=" & Chr(34) & "http://www.sii.cl/SiiDte" & Chr(34) & " xmlns:xsi=" & Chr(34) & "http://www.w3.org/2001/XMLSchema-instance" & Chr(34) & ""
                    ' Console.WriteLine("cadena: " & cadenaReempl)
                    stringXml = CStr(row("XML")).Replace(cadenaReempl, "")
                    Console.WriteLine("XMLmod; " & stringXml)
                    Dim doc As XmlDocument = New XmlDocument()
                    '  nm = New XmlNamespaceManager(doc.NameTable)
                    Dim m_nodelist As XmlNodeList
                    Dim nodo As XmlNode
                    '  nm.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
                    doc.LoadXml(stringXml)
    
                    Try
    
                        Dim IdDocList As XmlNodeList = doc.SelectNodes("/DTE/Documento/Encabezado/IdDoc")
    
                        For Each iddocl As XmlNode In IdDocList
    
                            tipoDte = iddocl.SelectSingleNode("TipoDTE").InnerText
    
                            folio = iddocl.SelectSingleNode("Folio").InnerText
                            fchEmis = iddocl.SelectSingleNode("FchEmis").InnerText
                            ' rznSoc = iddocl.SelectSingleNode("RznSoc").InnerText
                            If iddocl.SelectSingleNode("FmaPago") Is Nothing Then
                                formaPago = String.Empty
                            Else
                                formaPago = iddocl.SelectSingleNode("FmaPago").InnerText
                            End If
    
                            If iddocl.SelectSingleNode("FchVenc") Is Nothing Then
                                fchVenc = String.Empty
                            Else
                                fchVenc = iddocl.SelectSingleNode("FchVenc").InnerText
                            End If
    
                            Console.WriteLine("fchEmis " & fchEmis)
                            Console.WriteLine("razon social " & rznSoc)
                            ' Label3.Text = "Fecha Emision " & FchEmis
                            ' Label4.Text = "Fecha Vencimiento " & FchVenc
                        Next
    
    

    martes, 11 de mayo de 2021 17:23