none
Convertire file TXT in XML RRS feed

  • Domanda

  • Buongiorno a tutti

    Da principiante della programmazione...chiedo vostro consiglio / aiuto.

    Ho file di testo formattato con la seguente struttura

     

    ----------------------------------------------------------------------
      Cliente: Cliente di prova
    ----------------------------------------------------------------------

      File              : Cliente di prova
      Note              : test
      Percorso          : C:\Clienti\Elenco\Cliente di prova
      Creazione         : 15/04/2020 14:02:53

    ----------------------------------------------------------------------
      Articolo        Descrizione
    ----------------------------------------------------------------------
      AB1             ESEMPIO ARTICOLO 1
      AB2             ESEMPIO ARTICOLO 2
     ----------------------------------------------------------------------
    La necessità è convertirlo in file XML che abbia la seguente struttura

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Data>
      <Cliente>
         <ClientetId> Cliente di prova</ClientetId>
          <ListaArticoli>
          <ArticoliInLista>
            <Posizione>1</Posizione>
            <Articolo>
              <ArticoloId>AB1</ArticoloId>
              <Descrizione>ESEMPIO ARTICOLO 1</Descrizione>
            </Articolo>
          </ArticoliInLista>
          <ArticoliInLista>
            <Posizione>2</Posizione>
            <Articolo>
              <ArticoloId>AB2</ArticoloId>
              <Descrizione>ESEMPIO ARTICOLO 2</Descrizione>
            </Articolo>
          </ArticoliInLista>
        </ToolList>
      </Cliente>
    </Data>

    Da auto ditta e prendendo spunto da altre discussioni su questo forum ho scritto il seguente codice

     

    Imports System.Xml
    Imports System.Text
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim sorgente As String
            If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                sorgente = OpenFileDialog1.FileName
            Else : Exit Sub
            End If
            System.IO.File.Copy(sorgente, "c:\temp\MyFile.txt", True)
            System.IO.File.Delete(sorgente)
            Dim myFile As String = My.Computer.FileSystem.ReadAllText("C:\Temp\MyFile.txt")
            Dim ar As String() = myFile.Split(vbCrLf)
            Dim myXML As New XmlTextWriter("C:\Temp\MyFile.xml", Encoding.ASCII)
            myXML.Formatting = Formatting.Indented
            myXML.Indentation = 2
            myXML.WriteStartDocument(True)
            myXML.WriteStartElement("Data")
            myXML.WriteStartElement("Cliente")
            myXML.WriteStartElement("ClienteId")


            For i As Integer = 1 To ar.Length - 0
                ScriviArchivio(myXML, ar(1))
            Next

            myXML.WriteStartElement("ListArticoli")

            For i As Integer = 1 To ar.Length - 0
                ScriviArchivio2(myXML, ar(12))
            Next

            myXML.WriteEndElement()
            myXML.WriteEndElement()
            myXML.WriteEndElement()
            myXML.WriteEndDocument()
            myXML.Close()
        End Sub
        Private Sub ScriviArchivio(ByVal xw As XmlWriter, ByVal str As String)


            xw.WriteStartElement("ClienteId")
            xw.WriteString(str.Substring(14, 11))
            xw.WriteEndElement()


        End Sub

        Private Sub ScriviArchivio2(ByVal xw As XmlWriter, ByVal str As String)

            xw.WriteStartElement("ArticoloInLista")

            xw.WriteStartElement("Posizione")
            xw.WriteString(1)
            xw.WriteEndElement()

            xw.WriteStartElement("Articoli")

            xw.WriteStartElement("ArticoloId")
            xw.WriteString(str.Substring(3, 3))
            xw.WriteEndElement()

            xw.WriteStartElement("Descrizione")
            xw.WriteString(str.Substring(20, 14))
            xw.WriteEndElement()

            xw.WriteEndElement()

            xw.WriteEndElement()

        End Sub
    End Class

    Ma non ottengo struttura xml necessaria.

    il problema è il TAG "posizione" che non incrementa ma resta sempre a 1

    così come TAG "ArticoloId"  che legge solo il primo

    Avete una dritta / aiuto da darmi

    Grazie mille in anticipo a tutti per qualsiasi risposta


    • Modificato Met75 lunedì 20 aprile 2020 12:52
    lunedì 20 aprile 2020 12:48

Risposte

  • Un po' complicato da leggere, soprattutto senza avere il testo originale.

    Come fa ad incrementare la posizione se l'unica cosa che fai è dirgli 

    xw.WriteString(1)

    Lui fa quello che dici tu, ovvero scrive 1 (che è un numero e non una stringa, e già ci sarebbe da dire).

    Secondo me dovresti passargli tu la posizione, ad esempio quando fai il ciclo 

    For i As Integer = 1 To ar.Length - 0 (a proposito, perché sottrai 0 ad ar.Lenght?)

    Perché passi sempre l'elemento 1 dell'array AR in

    ScriviArchivio(myXML, ar(1))

    questa istruzione è in un loop che prende in considerazione la lunghezza di ar, ma tu riporti sempre l'elemento 1.

    Non riesco a capire molto, ma ho il sospetto che anche il modo di leggere il file sia abbastanza dubbio.

    lunedì 20 aprile 2020 16:30
  • Ciao Met75 (il lei lo lasciamo agli studi notarili, vero?)

    Bene andare per passi graduali.

    Come prima cosa inizierei a capire come fare ad estrapolare i dati del file di testo, dando per scontato che si tratti di una tabella. Come sicuramente saprai, una tabella è formata da una o più colonna ( i campi) e una o più riga ( i record)

    Di solito una riga del file di testo (quelle che tu trovi con il comando Split sul testo letto) corrisponde ad una riga della tabella. Di ciascuna riga, devi trovare anche tutti i campi, quindi devi sapere come questo file di testo è formattato (separatore con virgole, con punto e virgola, con tabulazioni, campi a lunghezza fissa ecc...).

    Se non sai questo, non puoi procedere oltre.

    Diciamo che per arrivare a scrivere fisicamente il file xml, serve ancora qualche passo; se ancora non sai leggere la sorgente, è difficile trovare un modo per tradurla ed addirittura riscriverla.

    Buono studio e se ti serve, siamo qui!

    P.s. Lo dico a tutti, e non sfuggi neanche tu... Mi raccomando di usare l'opzione Strict impostata ad ON, ti richiede qualche volta la scrittura di qualche parola in più, ma ti evita tanti piccoli, e subdoli, errori.

    martedì 21 aprile 2020 13:48

Tutte le risposte

  • Un po' complicato da leggere, soprattutto senza avere il testo originale.

    Come fa ad incrementare la posizione se l'unica cosa che fai è dirgli 

    xw.WriteString(1)

    Lui fa quello che dici tu, ovvero scrive 1 (che è un numero e non una stringa, e già ci sarebbe da dire).

    Secondo me dovresti passargli tu la posizione, ad esempio quando fai il ciclo 

    For i As Integer = 1 To ar.Length - 0 (a proposito, perché sottrai 0 ad ar.Lenght?)

    Perché passi sempre l'elemento 1 dell'array AR in

    ScriviArchivio(myXML, ar(1))

    questa istruzione è in un loop che prende in considerazione la lunghezza di ar, ma tu riporti sempre l'elemento 1.

    Non riesco a capire molto, ma ho il sospetto che anche il modo di leggere il file sia abbastanza dubbio.

    lunedì 20 aprile 2020 16:30
  • Buongiorno vbMizio

    Anzitutto grazie mille per la risposta e per il suo tempo

    Il problema di fondo è che sono un principiante, consideri che ho scritto quanto sopra con esperienza zero, documentandomi prima con manuale e leggendo qualche forum ma poi completamente da auto didatta.

    Quindi è plausibile che quanto compilato sia scritto nel modo sbagliato.

    Mi documenterò e studierò

    Grazie mille ancora


     


    martedì 21 aprile 2020 13:10
  • Ciao Met75 (il lei lo lasciamo agli studi notarili, vero?)

    Bene andare per passi graduali.

    Come prima cosa inizierei a capire come fare ad estrapolare i dati del file di testo, dando per scontato che si tratti di una tabella. Come sicuramente saprai, una tabella è formata da una o più colonna ( i campi) e una o più riga ( i record)

    Di solito una riga del file di testo (quelle che tu trovi con il comando Split sul testo letto) corrisponde ad una riga della tabella. Di ciascuna riga, devi trovare anche tutti i campi, quindi devi sapere come questo file di testo è formattato (separatore con virgole, con punto e virgola, con tabulazioni, campi a lunghezza fissa ecc...).

    Se non sai questo, non puoi procedere oltre.

    Diciamo che per arrivare a scrivere fisicamente il file xml, serve ancora qualche passo; se ancora non sai leggere la sorgente, è difficile trovare un modo per tradurla ed addirittura riscriverla.

    Buono studio e se ti serve, siamo qui!

    P.s. Lo dico a tutti, e non sfuggi neanche tu... Mi raccomando di usare l'opzione Strict impostata ad ON, ti richiede qualche volta la scrittura di qualche parola in più, ma ti evita tanti piccoli, e subdoli, errori.

    martedì 21 aprile 2020 13:48
  • dai un'occhiata qui http://www.nullskull.com/q/10057110/code-to-convert-txt-file-to-xml.aspx
    martedì 21 aprile 2020 17:23
  • Grazie a tutti per i consigli e per le dritte
    martedì 21 aprile 2020 19:26