2010-01-19 3 views
5

Comment rechercher et remplacer une valeur de variable dans un fichier XML en utilisant Delphi?Comment rechercher et remplacer une valeur d'étiquette dans un fichier XML en utilisant Delphi?

Je sais ce qu'est la balise XML, mais la valeur est aléatoire et doit simplement être réinitialisée à une valeur par défaut, donc en réalité je ne peux/ne devrais pas chercher la valeur mais seulement la balise. Je connais également l'emplacement du ou des fichiers.

Je suis nouveau à Delphi, quelqu'un peut-il me fournir un exemple simple sur la façon dont cela pourrait être fait?

Merci d'avance.

Répondre

6

La meilleure méthode utilise un analyseur XML , par exemple:


Si c'est un fichier XML plutôt petit, vous pouvez aussi simplement charger le XML dans une chaîne (liste) et utiliser une expression régulière :

var 
    Regex: TPerlRegEx; 

Regex := TPerlRegEx.Create(nil); 
Regex.RegEx := '<yourtag>.*?</yourtag>'; 
Result := objRegEx.Replace(inputString, replacementString, true); 

Vous pouvez obtenir le composant TPerlRegex here .


La troisième façon comprendrait faire tout le sale boulot main, en utilisant pos, delete et insert. Vous devrez trouver les deux poses des balises d'ouverture et de fin et la position du> pour la balise ouvrante), supprimez la chaîne entre ces deux index et insérez votre valeur par défaut par la suite (et vous devrez itérer sur tous les matches s'il y a plus d'une occurrence). Pas comme je le voudrais ;-)

+1

expressions régulières ont généralement l'inconvénient qu'ils ne prennent pas picularities du format texte sous-jacent en compte (par exemple, regardez la richesse de « valider adresse_électronique_désignée-en utilisant-regex »). Donc, je suggère que vous mettiez la possibilité XML Parser dans votre réponse d'abord. –

+0

Je suis d'accord ... fait. – Leo

+0

+1; Merci pour l'édition. –

9

Je chargerais le fichier XML en utilisant le IXMLDocument de Delphi et utiliserais le document pour remplacer l'élément. Quelque chose comme ceci:

uses 
    XMLDoc, 
    XMLIntf; 

procedure ChangeTag(const filename : String); 
var 
    doc : IXMLDocument; 
    parent : IXMLNode; 
    toReplace : IXMLNode; 
    replacement : IXMLNode; 
begin 
    doc := LoadXMLDocument(filename); 

    parent := doc.DocumentElement.ChildNodes.FindNode('parent'); 
    toReplace := parent.ChildNodes.FindNode('toReplace'); 

    replacement := doc.CreateElement('replacement', ''); 
    replacement.Text := toReplace.Text; 

    parent.ChildNodes.ReplaceNode(toReplace, replacement); 

    doc.SaveToFile(filename); 
end;