Autore Topic: Errore con i tag XmlWriter in gb.xml  (Letto 8691 volte)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Errore con i tag XmlWriter in gb.xml
« il: 13 Giugno 2012, 22:15:15 »
per vuott, ambassador gambas...  ;D

Ho riscontrato un'altro problema, legato alla libreria gb.xml, in particolare con XMLWriter (ma probabilemnte c'è qualcosa anche con XMLReader).

Faccio un esempio che forse rende meglio l'idea. Io devo scrivere un file xml, con una serie di tag nidificati, dove la maggior parte degli elementi hanno un un'uico valore (Text), come ad esempio:
Codice: [Seleziona]
<Tags>
<Tag1>valore</Tag1>
<Tag2>valore</Tag2>
</Tags>
Come si può notare, Tag1 e Tag2 hanno un valore, e questo viene racchiuso tra l'apertura del tag "<Tag1>", e la sua chiusura "/Tag1>".
Fino a qui la logica credo sia semplice e chiara, e questa è stata finora adottata in tutte le mie applicazioni, compreso pgDesigner (che di file xml ne legge parecchi).

Dovo aver scaricato l'ultima versione di Gambas3 in formato sorgente, oggi è la 4827, ho riscontrato che la lettura ha qualcosa che non và (ancora da chiarire), mentre la scrittura ha un errore, che ho verificato nei sorgenti della classe XmlWriter.class, di cui posto la parte interessata al problema:
Codice: [Seleziona]
Public Sub StartElement(TagName As String, Optional Attributes As String[], Optional Prefix As String, Optional URI As String)
  
  Dim Xmlns, s, sData As String
  Dim i As Integer = 0
  If URI Then
    Xmlns = " xmlns"
    If Prefix Then Xmlns &= ":" & Prefix
    Xmlns &= "=\"" & URI & "\""
  Endif
  If Prefix Then TagName = Prefix & ":" & TagName
  
  sData = "<" & TagName
  
  If Attributes
    If (Attributes.Count Mod 2) Then Attributes.Push("")
    For i = 0 To Attributes.Max Step 2
      sData &= " " & Attributes[i] & "=\"" & Attributes[i + 1] & "\""
    Next
  Endif
  
  sData &= Xmlns
  
  If Not $TagEnded Then 'On ferme le tag précédent
    Write(">" & If($indent, "\n", ""), True)
  Endif
  
  $TagEnded = False
  
  Write(sData)
  
  PileElements.Push(TagName)
  
End

Public Sub EndElement()
  
  Dim tag As String
  
  If Not PileElements.Count Then Return
  
  tag = PileElements.Pop()
  
  If Not $TagEnded Then 'On ferme le tag précédent
    Write(" />" & If($indent, "\n", ""), True) 'Pas de contenu
    $TagEnded = True
  Else
    Write("</" & tag & ">")
  Endif
  
End
il codice applica una logica errata, o perlomeno parte da un presupposto non completamente corretto. In pratica il tag viene aperto e chiuso tramite lo stato della variabile $TagEnded, non tenendo conto che potrebbe esserci un valore Text in mezzo. Questo causa la scrittura errata del tag, come da esempio:
Codice: [Seleziona]
<Tag1valore />
<Tag2valore />
in pratica unisce il nome del tag con il valore stesso.
La sequenza con cui viene aperto e chiuso il tag, e associato a questo un valore è come da esempio:
Codice: [Seleziona]
DIM oXml As XmlWriter
...
oXml.StartElement("Tag1")
oXml.Text("valore")
oXml.EndElement()

Con la versione 3.1.1 la cosa funzionava, ma ora con gli ultimi aggiornamenti non và più. Non sò se dalla 3.1.1, le build successive riportano tutte lo stesso problema, ma di sicuro la 4827.

Caro vuott, dato che scrivere direttamente a Benoit mi è sempre restato piuttosto difficoltoso, sarebbe di gran utilità (e non solo per me), notificare a Minisini questo problema, per poter correggere al più presto.
Tieni conto che il pezzo di sorgente ad inizio post è estratto dalla classe inclusa nei sorgenti di gambas, ed è scritta nello stesso linguaggio, per cui è semplice sistemarla.

Grazie

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #1 il: 14 Giugno 2012, 01:02:13 »
per vuott, ambassador gambas...  ;D
.................

Le comunichiamo che gli Uffici di questa Ambasciata hanno provveduto a trasmettere formalmente al Presidente Minisini quanto da Lei sopra rappresentato.
L'Ambasciata si adopererà senza indugio alcuno, non appena sarà giunta eventuale risposta, a trascrivere su questa pagina il contenuto della medesima.   ;D
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #2 il: 14 Giugno 2012, 10:15:50 »
Più che ambasciatore, sei una perfetta segretaria...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #3 il: 14 Giugno 2012, 11:16:02 »
Più che ambasciatore, sei una perfetta segretaria...  ;D

...già ! :-X Non me ne ero accorto.

...ed allora, sotto potete vedere una foto di Vuott trasformato, come d'incanto e limitatamente per questa occasione, da Ambasciatore in una segretaria sexy.  
« Ultima modifica: 14 Giugno 2012, 12:30:33 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #4 il: 14 Giugno 2012, 14:15:21 »
A parte che sà di "fregatura"...  ;D

Anche così, come ambasciatRICE non saresti male...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #5 il: 14 Giugno 2012, 21:27:36 »
Anche così, come ambasciatRICE non saresti male...  ;D

...del resto si dice anche: "Ambasciator non porta pen... A".  :P
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #6 il: 14 Giugno 2012, 22:59:59 »
...in effetti...  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #7 il: 15 Giugno 2012, 01:49:07 »
Allora... ho ricevuto una prima risposta da un utente della Lista, il quale pare dica che è stato già affrontato questo problema, e che dovrebbe essere stato risolto:

"This should be solved in the revision #4826."


...però mi pare che tu lo abbia riscontrato anche con la rev. 4827. Se non erro.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #8 il: 15 Giugno 2012, 10:09:42 »
Esatto!  :D

Tra l'altro ieri ho scaricato la 4829, ma dà errore all'apertura dell'ide. Sono ritornato alla 4827...

Risolto non credo proprio, in quanto già nei sorgenti ci sono evidenti anomalie.

Ora stò provando ad usate XmlDocument, invece del XmlReader/XmlWriter, e mi pare funzioni anche se ha una logica completamente diversa, ma più vicina ad altre libreria di altri linguaggi.

Stò pensando che, probabilmente, l'idea dello sviluppatore è quella di eliminare le due classi XmlReader/Writer, in favore di ulteriori classi più dinamiche...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #9 il: 15 Giugno 2012, 10:22:37 »
Stamane, in effetti, trovo una correzione da parte di quell'utente, il quale così mi scrive:
"Oops, this is the #4829, not the #4826, of course..."

...però la 4829 non funziona proprio. Bisognerà attendere una successiva versione per il superamento di questo errore).
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #10 il: 15 Giugno 2012, 10:25:25 »
...però la 4829 non funziona proprio. Bisognerà attendere una successiva versione per il superamento di questo errore).

Leggo ora un messaggio di Minisini:

"The bug in toolbar management that made the IDE crashing at startup with
the "Invalid object" error should have been fixed.

In revision #4830.

Please confirm!

--
Benoît Minisini
"
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #11 il: 15 Giugno 2012, 11:43:02 »
Lo vedo stasera... e ti faccio sapere...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.269
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #12 il: 15 Giugno 2012, 12:33:58 »
Ho inviato i tuoi dubbi aggiunti nel tuo penultimo messaggio; ed il tipo che aveva risposto lì nella Lista internazionale su questo argomento, da te sollevato, aggiunge quanto segue (te lo riporto nella lingua originaria per evitare errori di interpretazione e traduzione da parte mia):

" Anomalies ? Where ?


The idea is not to "eliminate" XmlReader and XmlWriter. For two reasons :

- They still can be very useful. The new XmlReader and XmlWriter are not
made for little documents (as said, the others are more dynamic), but they
are made for streams.
For example, you can "connect" a TCP socket to XmlReader and Writer, and
they will read/write the XML for you. Here is a little example with
XmlReader (the page is in french, but the program is in english) :
http://www.gambasforge.org/code-63-xmltalk.html.

- For compatibility reasons. Before the new gb.xml arrived, the
XmlDocument/XmlNode classes were very poor (unusable). So, everyone use
XmlReader and XmlWriter...

Regards,
Adrien.
"
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #13 il: 15 Giugno 2012, 13:35:37 »
Il mio era infatti solo un dubbio, se non è così, meglio...

Riguardo alla gestione di piccoli documenti... ma che vuol dire? O sono grandi, oppure non li tratta?
Dalle prove che ho fatto, sono stati effettuati un mucchio di cambiamenti, che hanno reso inagibile tutto il codice utilizzato.
Tanto per farla semplice, già dopo un Open(file), oppure un OpenStream(), sembra che leggano, eppure non fanno alcun parsing del contenuto xml, restituendo 0 in tutte le proprietà. Questo ovviamente rende un pochino difficile la decodifica dei dati... non credi?

Sempre nelle prove, ho provato ad usare XmlDocument, XmlElement e XmlNode, e devo dire che in qualche, anche perchè cambia la logica, i dati riesco ad ottenerli, anche se ho trovato anche qui qualche anomali, del tipo che nel Save(), ai test vengono aggiunti spazi indesiderati in testa e in coda.
E' pur vero che, come da risposta, queste classi sono ancora incomplete, e quindi ancora non stabile, quindi meglio non utilizzarle.

Ad ogni modo, i file xml che tratto, possono essere grandi o piccoli, a seconda delle esigenze, ma questo non può essere causa di malfunzionamenti. Al contrario, mi aspetto che i malfunzionamenti si verifichino appunto con file di grosse dimensioni, in quanto è probabile che la libreria usi il sistema DOM, caricando tutto in memoria.
Oltre a questo, i file che tratto possono avere strutture semplici e complesse, con tag con attributi, testi, o sottoelementi, in maniera gerarchica e a vari livelli. E' ovvio che, ove possibile, ho cercato di ottimizzare e semplificare le logiche, ma non posso farlo per tutto, altrimenti l'uso del protocollo xml perde di significato. E' anche ovvio che non stò usando modalità ipercomplesse, come di solito mi trovo a trattare anche per lavoro, per cui non vedo grosse difficoltà.

Stasera posto qualche esempio di lettura/scrittura, codice che è inserito nei miei programmi, così magari possono dargli un'occhiata, e verificare quanto dico...  :-\

P.S.: forse sarebbe il caso che negli esempi, inserissero qualcosa a riguardo, così magari si risolvono le lacune della documentazione, ed evitare di andare per tentativi...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Errore con i tag XmlWriter in gb.xml
« Risposta #14 il: 15 Giugno 2012, 17:50:22 »
Ho scaricato l'ultima versione dei sorgenti di Gambas3 (4833), ma le anomalie persistono.

Il seguente è il codice che stò utilizzando, e che è un estratto depurato di quello originale usato in pgDesigner3, per la lettura del file di configurazione, che prima funzionava e ora non và più:
Codice: [Seleziona]
Public Sub Main()
  Dim reader As New XmlReader
  Dim s As String[]
 
  reader.Open("/home/luigi/tmp/text.xml")
  While (Not reader.Eof)
    s = [reader.Node.Depth,
         reader.Node.Name,
         reader.Node.Type,
         reader.Node.Value,
         reader.Node.Attributes.Count]
    Print "[" & s.Join("],[") & "]"
    Print reader.Node.Dep

    Select Case reader.Node.Type
      Case XmlReaderNodeType.Element
        Print "Element::" & reader.Node.Name, reader.Node.Value
        For Each reader.Node.Attributes
          Print reader.Node.Name, reader.Node.Value
        Next
      Case XmlReaderNodeType.EndElement
        Print "EndElement::"
      Case XmlReaderNodeType.Text
        Print "Text::" & reader.Node.Value
    End Select
    Print "Read = " & reader.Read() 'return EndStream
  Wend
End
ci sono alcuni Print, per capire cosa contengono le variabili, ma sono tutte vuote. I problemi non cambiano, sia con Open() che con fromString().
Ho anche usato il file di prova contenuto nei sorgenti di gambas "text.xml", il cui contenuto è molto semplice:
Codice: [Seleziona]
<?xml version="1.0"?>
<toto machin="toto">Hello<truc>Bouh</truc><!-- Hello -->
</toto>
<titi>Hellow</titi>

In allegato invio anche quello usato per la versione di pgDesigner3 che stò sviluppando, e che è un tantino più grande e più articolato.

Stò cercando di localizzare il problema nei sorgenti di gambas3 ma non riesco a trovare il bandolo della matassa, in quanto parte è in linguaggio gambas, parte è in C, parte è di libreria esterna...