Problème de la construction d'un document XML à l'aide TXMLDocument
Je suis nouveau sur delphi et maintenant je dois lire de créer un fichier xml. mon code est le suivant:
function foo.createXMLDocument(): TXMLDocument;
var
res: TXMLDocument;
rootNode: IXMLNode;
sl : TStringList;
begin
res := TXMLDocument.Create(nil);
res.Active := true;
rootNode := res.AddChild('label');
// create string for debug purposes
sl := TStringList.Create;
sl.Assign(res.XML);// sl is empty after this assignment
//add more elements
generateDOM(rootNode);
Result := res;
end;
Le problème, c'est le nombre de nœuds enfants augmente, mais res.XML est vide. Pour ne pas mentionner que le reste des éléments dans la generateDOM procédure ne semble pas faire quoi que ce soit. Je vais être très heureux avec votre aide.
Ce serait bien si vous nous avez fourni les Delphi version que vous utilisez. Voir ma réponse dans le cas de D2007.
OriginalL'auteur Sambatyon | 2009-10-07
Vous devez vous connecter pour publier un commentaire.
Avertissement: Testé avec D2007.
Votre code ne prévoit en effet de créer le XML (
<label/>
), comme indiqué dans modifiés en fonction:Mais il demande un beaucoup de remarques:
- Vous n'avez pas besoin d'un local res variable, il suffit d'utiliser le Résultat.
- Vous n'avez pas besoin d'un supplément StringList pour voir le XML: Résultat.Xml.Texte
- N'oubliez pas de Gratuit la sl StringList si vous en créer un.
- XmlDocument de votre retour est inutilisable en dehors de la fonction et donne un AV si vous essayez.
Pourquoi?
C'est parce que un XMLDocument est destiné à être utilisé comme un Composant avec un Propriétaire, ou comme un Interface par ailleurs, afin de gérer ses vie.
Le fait que vous utilisez une Interface de tenir rootNode causes d'être détruits à la fin de la CreateXmlDocument fonction. Et si vous regardez le code de la
TXMLNode._Release
, vous verrez qu'il déclenche desTXMLDocument._Release
qui appelle à Détruire, à moins qu'un Propriétaire pour la XMLDocument (ou d'une interface d'y faire référence).C'est pourquoi le XMLDocument est valide et peuplée à l'intérieur de la CreateXMLDocument fonction, mais pas disponible à l'extérieur, sauf si vous revenez d'une Interface ou de fournir un Propriétaire.
Voir le des solutions de rechange ci-dessous:
OriginalL'auteur François
La Delphi Aider de TXMLDocument.Méthode AddChild dit (au bas):
Et c'est ce que vous êtes en train de faire? 🙂
Voici une introduction de l'article sur Delphi Document XML Programmation et montre comment vous pouvez travailler avec le TXMLDocument.DocumentElement propriété à la place de votre définition de la rootnode variable dans votre code.
dans D2007 TXmlDocument.AddChild crée la DocumentNode si ce n'est déjà là et appelle sa méthode AddChild. Il n'est donc pas le problème.
Erwin, vous permet de modifier votre réponse, mais je ne pense pas que vous avez tenu compte de mon commentaire.
Ce n'était pas exactement ce que je cherchais, mais le lien pour l'aide a été extrêmement utile puisque je n'ai accès qu'à la version allemande de l'delphi aider et je cherchais la version anglaise en ligne.
OriginalL'auteur Erwin
Dans mon semblable mise en œuvre, je déclare res comme IXMLDocument au lieu de TXMLDocument.
OriginalL'auteur J__