2009-03-17 8 views
0

Salut, je suis un programmeur débutant qui tente d'utiliser TXMLparser avec Delphi pour lire un petit fichier XML afin de comprendre comment ils fonctionnent. J'ai la structure suivante dans le fichier xml 'parser.xml';problème de programmation avec des fichiers xml dans delphi

<rule> 
    <alert>priority 3</alert> 
    <desc> </desc> 
    <action>beep</action> 
</rule> 

et moi avons le code suivant dans delphi

VAR 
    Parser : TXmlParser; 
    rule, alert: string; 
    i:integer; 

BEGIN 
    Parser := TXmlParser.Create; 
    Parser.Normalize := TRUE; 
    Parser.LoadFromFile ('c:\parser.xml'); 
    Parser.StartScan; 

    WHILE Parser.Scan DO 
    CASE Parser.CurPartType OF 
     ptStartTag, 
     ptEmptyTag :    
     For i:=0 TO Parser.CurAttr.Count-1 Do 
     Begin 
      rule :=Parser.CurAttr.rule (i); 
      alert :=Parser.CurAttr.alert (i); 
     ptContent, 
     ptCData : // Process Parser.CurContent field here 
     ptEndTag : // Process End-Tag here (Parser.CurName) 
     ptPI  : // Process PI here 
        // (Parser.CurName is the target, Parser.CurContent) 
    END; 
    Parser.Free; 
end. 

Je ne comprends pas où, et avec quelle syntaxe (par exemple ou « règle » ou règle) Je suis d'entrer dans les balises xml. J'ai obtenu la base du code du site Web XML, mais la boucle FOR est à moi. Semble fonctionner correctement mais la règle et l'alerte reviennent comme identificateurs non déclarés, même s'ils sont définis dans VAR

entrer et comment entrer les étiquettes et pourquoi les identifiants ne sont pas reconnus serait apprécié.

Merci

+0

Edité pour retester sans les balises "gui" et "pascal", car il s'agit d'une question spécifique à Delphi (pas de Pascal général) et cela n'a absolument rien à voir avec une interface utilisateur graphique. –

Répondre

2

La boucle est votre problème (ou l'un d'entre eux):

ptEmptyTag :    
     For i:=0 TO Parser.CurAttr.Count-1 Do 
     Begin 
      rule :=Parser.CurAttr.rule (i); 
      alert :=Parser.CurAttr.alert (i); 
     end; // <-- Insert end here 
    ptContent, 
    ptCData : // Process Parser.CurContent field here 
    ptEndTag : // Process End-Tag here (Parser.CurName) 
    ptPI  : // Process PI here 
       // (Parser.CurName is the target, Parser.CurContent) 
end; // case 
+0

L'autre extrémité était pour l'instruction case donc il ne devrait pas être enlevé ;-) –

+0

Corrigé, merci. – schnaader

3

Juste quelques remarques sur le code:

  • s'il vous plaît ne pas utiliser majuscules pour mots réservés.
  • utiliser enfin essayer pour les objets créés
  • utilisation supplémentaires begin/blocs terminaux pour les états complexes imbriqués
  • vous avez oublié une fin ;-)
  • utiliser les fonctions
  • essayez d'utiliser une clause else dans une déclaration de cas

/

procedure ProcessXML(const AFileName: string); 
var 
    Parser  : TXmlParser; 
    rule, alert : string; 
    i   : Integer; 

begin 
    Parser := TXmlParser.Create; 
    try 
    Parser.Normalize := TRUE; 
    Parser.LoadFromFile (AFileName); 
    Parser.StartScan; 

    while Parser.Scan do begin 
     case Parser.CurPartType of 
     ptStartTag, 
     ptEmptyTag : begin    
      for i := 0 to Parser.CurAttr.Count-1 do begin 
      rule :=Parser.CurAttr.rule (i); 
      alert :=Parser.CurAttr.alert (i); 
      end; 
     end; 
     ptContent, 
     ptCData : // Process Parser.CurContent field here 
     ptEndTag : // Process End-Tag here (Parser.CurName) 
     ptPI  : // Process PI here 
        // (Parser.CurName is the target, Parser.CurContent) 
    else 
     // Do something 
    end; 

//

finally 
    Parser.Free; 
    end; 
end; 

Et appelez la fonction:

begin 
    ProcessXML('c:\parser.xml'); 
end. 

Rechercher des informations sur TXMLParser on their site.

+0

Bons conseils. +1 pour ça. Je n'aime pas avoir "commencer" à la fin d'une ligne. Dans votre exemple, vous voyez exactement pourquoi: vous avez oublié une «fin» de clôture; pour correspondre à 'tout'. Si commencer était sur une nouvelle ligne, vous le verriez en un clin d'œil. –

4

Je ne suis pas un utilisateur de TXMLParser, mais un voyage rapide à la section documentation et FAQs page montre le problème.

Le problème avec les identificateurs non déclarés n'est pas dû aux variables que vous avez déclarées dans la section vars; il est dans la boucle sur le côté droit de la mission (voir les lignes se terminant par « // **** » commentaires:

VAR 
    Parser : TXmlParser; 
    rule, alert: string; 
    i:integer; 

BEGIN 
    Parser := TXmlParser.Create; 
    Parser.Normalize := TRUE; 
    Parser.LoadFromFile ('c:\parser.xml'); 
    Parser.StartScan; 

    WHILE Parser.Scan DO 
    CASE Parser.CurPartType OF 
     ptStartTag, 
     ptEmptyTag :    
     For i:=0 TO Parser.CurAttr.Count-1 Do 
     Begin 
      rule := Parser.CurAttr.rule (i); // **** problem here with .rule 
      alert :=Parser.CurAttr.alert (i); // **** problem here with .alert 
     ptContent, 
     ptCData : // Process Parser.CurContent field here 
     ptEndTag : // Process End-Tag here (Parser.CurName) 
     ptPI  : // Process PI here 
        // (Parser.CurName is the target, Parser.CurContent) 
    END; 
    Parser.Free; 
end; 

Rien n'a établi .rule() ou .alert comme méthodes de Parser.CurAttr, et vous ne pouvez pas les traiter comme tels Essayez ceci:.

rule := Parser.CurrAttr.Value('rule'); 
alert := Parser.CurrAttr.Value('alert'); 

en fait, maintenant que je regarde plus au XML que vous avez publié, vous n'êtes pas traiter avec des attributs du tout, mais le contenu à la place.Les attributs seraient le long des lignes de:

<rule name="My rule" priority="3" alert="Very important">Other stuff</rule> 

encore, je vais quitter ce poste juste parce qu'il explique l'erreur de syntaxe que vous rencontrez en ce qui concerne les identificateurs non déclarés.

1

Jetez un coup d'œil à l'utilisation de l'assistant de databinding XML de Delphi. Il peut créer un wrapper de classe fortement typé autour du XML/schéma, donc travailler avec le XML est aussi facile que n'importe quel autre objet.

ex. rule.Alert: = 'Alerte'; rule.Description: = 'Bonjour'; rule.Action: = 'beep';

+0

Bien que cela puisse être une bonne suggestion, ce n'est pas une réponse à la question posée. L'Assistant de liaison de données XML n'est pas une solution aux identificateurs non déclarés ou à l'aide de TXMLParser. –

Questions connexes