Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di poyel
    Registrato dal
    Oct 2010
    Messaggi
    51

    [DELPHI] Navigazione file xml

    Ciao ragazzi, ho un problema con un applicazione che sto scrivendo in delphi.
    Devo creare un file di configurazione xml per il programma che contiene alcune impostazioni che mi serviranno per fare dei filtri per alcune query su un database, per essere più precisi sarà di questa forma:

    codice:
    <?xml version="1.0"?>
    <Filtri exe="Statistiche.exe" version="0.1">
    	<FiltriStandard>
    		<Filtro1 Attr="NomeFiltrostd1">
    			<Item condizione="condizioneSelect"/>
    		</Filtro1>
    		<Filtro2 Attr="NomeFiltrostd2">
    			<Item condizione="condizioneSelect"/>
    		</Filtro2>
    	</FiltriStandard>
    	<FiltriPersonalizzati>
    		<Filtro1 Attr="NomeFiltropers1">
    			<Item condizione="condizioneSelect"/>
    		</Filtro1>
    		<Filtro2 Attr="NomeFiltropers1">
    			<Item condizione="condizioneSelect"/>
    		</Filtro2>
    	</FiltriPersonalizzati>
    </Filtri>
    Il tag item può anche essere più di uno.
    Questo che ho postato è il file che ho generato con questo codice:

    codice:
    procedure TForm1.FormCreate(Sender: TObject);
    var 
      Root,FiltriStandard,FiltriPersonalizzati,NomeFiltro,Condizione : IXMLNode;
      doc:IXMLDocument;
    begin
      doc := NewXMLDocument;
    
      Root := Doc.AddChild('Filtri');;
      Root.Attributes['exe'] := 'Statistiche.exe';
      Root.Attributes['version'] := '0.1';
    
      FiltriStandard := Root.AddChild('FiltriStandard');
    
        NomeFiltro := FiltriStandard.AddChild('Filtro1');
        NomeFiltro.Attributes['Attr'] := 'NomeFiltrostd1';
          Condizione := NomeFiltro.AddChild('Item');
          Condizione.Attributes['condizione'] := 'condizioneSelect';
    
        NomeFiltro := FiltriStandard.AddChild('Filtro2');
        NomeFiltro.Attributes['Attr'] := 'NomeFiltrostd2';
          Condizione := NomeFiltro.AddChild('Item');
          Condizione.Attributes['condizione'] := 'condizioneSelect';
    
      FiltriPersonalizzati := Root.AddChild('FiltriPersonalizzati');
        NomeFiltro := FiltriPersonalizzati.AddChild('Filtro1');
        NomeFiltro.Attributes['Attr'] := 'NomeFiltropers1';
          Condizione := NomeFiltro.AddChild('Item');
          Condizione.Attributes['condizione'] := 'condizioneSelect';
        NomeFiltro := FiltriPersonalizzati.AddChild('Filtro2');
        NomeFiltro.Attributes['Attr'] := 'NomeFiltropers1';
          Condizione := NomeFiltro.AddChild('Item');
          Condizione.Attributes['condizione'] := 'condizioneSelect';
    
      Doc.XML.Text := XmlDoc.FormatXMLData(Doc.XML.Text);
      doc.Active := true;
      Doc.SaveToFile(ExtractFilePath(Application.ExeName)+'prova.xml');
    end;
    Penso che i rapporti di parentela siano rispettati.

    Ho poi creato una procedura per la lettura del file:

    MyxmlDoc:TXMLDocument;

    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var FiltriStandard,FiltriPersonalizzati,NomeFiltro : IXMLNode;
    
    Procedure ProcessNode(node:IXMLNode;list:TLMDListBox);
    begin
      if node = Nil then exit;
      list.Items.Add(VarToStr(Node.Attributes['Attr']));
      ProcessNode(Node.NextSibling,list);
    end;
    
    begin
      { recupero i filtri dal file xml forse -.-}
      MyXmldoc1.FileName := ExtractFilePath(Application.ExeName) + 'prova.xml';
      MyXmldoc1.Active := TRUE;
      Root := MyXmldoc1.DocumentElement.ChildNodes.First;
    
      FiltriStandard := Root.ChildNodes.First;
      ProcessNode(FiltriStandard,LMDListBox1);
    
      FiltriPersonalizzati := Root.NextSibling;
      ProcessNode(FiltriPersonalizzati,LMDListBox2);
    end;
    Quello che faccio in questa procedura è leggere i tag dei figli di FiltriStandard e FiltriPersonalizzati e inserirli in una listbox. Per Filitri Standard non ho nessun problema, ma i valori che mi interessano del nodo FiltriPersonalizzati non riesco a recuperarli.

    Avete qualche idea del perchè non funzioni per come dovrebbe?

    Sperando di essere stato abbastanza chiaro vi ringrazio in anticipo
    Il programmatore è colui che converte
    la caffeina in codice.

  2. #2
    Utente di HTML.it L'avatar di poyel
    Registrato dal
    Oct 2010
    Messaggi
    51
    Ragazzi ho risolto, se può essere di aiuto a qualcuno che avrà il mio stesso problema dico come ho risolto.

    La funzione di lettura del file xml era questa:
    codice:
    MyXmldoc1.FileName := ExtractFilePath(Application.ExeName) + 'prova.xml';
      MyXmldoc1.Active := TRUE;
      Root := MyXmldoc1.DocumentElement.ChildNodes.First;
    
      FiltriStandard := Root.ChildNodes.First;
      ProcessNode(FiltriStandard,LMDListBox1);
    
      FiltriPersonalizzati := Root.NextSibling; <-- ho modificato questa stringa
      ProcessNode(FiltriPersonalizzati,LMDListBox2);
    FiltriPersonalizzati := Root.NextSibling.ChildNodes.First;

    e magicamente sono riuscito a farlo funzionare.

    Ps Il fresco della mattina aiuta
    Il programmatore è colui che converte
    la caffeina in codice.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.