Violation d'accès lors du parcours de l'arborescence d'un fichier XML [Résolu]

Messages postés
41
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
20 octobre 2015
- - Dernière réponse : f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- 21 avril 2012 à 15:49
Bonjour, voilà, j'ai un petit souci :
J'ai codé 2 méthodes, dans une unité, qui permettent de lire un fichier XML afin d'initialiser un programme lors de son lancement, la 1ère ouvrant le fichier et la 2de, récursive, le parcourant. Mais lors l'exécution de la 2de, l'appel de la propriété "ChildNodes" d'un objet de type "IXMLNode" provoque une violation d'accès dont je ne parviens pas à déterminer la cause. En effet, les seuls pointeurs que j'utilise dans cette 2de méthode me sont renvoyés par des objets ou méthodes de l'unité "XMLDoc", ainsi que par la propriété ClassInfo du TObject passé en paramètre: ce sont des pointeurs initialisés et dont je n'ai pas à gérer la destruction, donc j'ai du mal à voir d'où peut venir cette violation d'accès qui, si je ne m'abuse, est symptomatique d'une mauvaise manip de pointeurs.

Voici les 2 méthodes en question :

//La 1ère, ouverture du fichier
function LireXml(a_strNomFichier: String; a_objAffecte: TObject): Boolean;
var
i: Integer;
v_xmlNoeud: IXmlNode;
v_xmlDocument: TXMLDocument;
v_lstNoeuds: IXMLNodeList;
begin
result:=false;
try
v_xmlDocument:=TXMLDocument.Create(nil);
v_xmlDocument.LoadFromFile(a_strNomFichier);
v_lstNoeuds:=v_xmlDocument.ChildNodes; //Pas de problème sur l'appel de "ChildNodes" ce coup-ci
result:=LireNoeuds(v_lstNoeuds, a_objAffecte);
except
on ex: Exception do begin
TraitementErreur(ex);
end;
end;
try
v_xmlDocument.Free();
except
on ex: Exception do begin
TraitementErreur(ex);
end;
end;
end;

function LireNoeuds(a_lstNoeuds: IXMLNodeList; a_objAffecte: TObject): Boolean;
var
i: Integer;
v_varTmp: Variant;
v_objTmp: TObject;
v_intObj: NativeUInt;
v_ndeNav: IXMLNode;
v_strTest: String;
v_strNomPropriete: String;
v_ptrPropInfo: PPropInfo;
v_ptrTypeInfo: PTypeInfo;
v_lstNoeuds: IXMLNodeList;
begin
result:=false;
try
for i := 0 to a_lstNoeuds.Count - 1 do
begin
v_ndeNav:=a_lstNoeuds.Get(i);
v_strNomPropriete:=v_ndeNav.NodeName;
v_ptrTypeInfo:=PTypeInfo(a_objAffecte.ClassInfo);
v_ptrPropInfo:=GetPropInfo(v_ptrTypeInfo, v_strNomPropriete);
if v_ptrPropInfo = nil then exit;
if v_ndeNav.HasChildNodes then //Vérif: le noeud a bien des enfants, donc il devrait être possible de les récupérer.
begin
v_varTmp:=GetPropValue(a_objAffecte, v_ptrPropInfo, False);
v_intObj:=NativeUInt(v_varTmp);
if v_intObj = 0 then exit;
v_objTmp:=TObject(v_intObj);
//Pourtant non, pas moyen de récupérer ses descendants
v_lstNoeuds:=v_ndeNav.ChildNodes; //Cet appel provoque une violation d'accès. Pourquoi ? Mystère...
if not LireNoeuds(v_lstNoeuds, v_objTmp) then exit;
end
else
begin
v_varTmp:=Variant(v_ndeNav.NodeValue);
SetPropValue(a_objAffecte, v_ptrPropInfo, v_varTmp);
end;
end;
result:=true;
except
on ex: Exception do begin
TraitementErreur(ex);
end;
end;
end;

Quant au xml, il a un format tout ce qu'il y a de plus classique :


Quelqu'un aurait-il la gentillesse de m'aider ?

Merci !
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
41
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
20 octobre 2015
3
Merci
En fait, ça marche très bien en codant la 1ère méthode comme ceci :
function LireXml(a_strNomFichier: String; a_objAffecte: TObject): Boolean;
var
i: Integer;
v_xmlNoeud: IXmlNode;
v_xmlDocument: IXMLDocument;
v_lstNoeuds: IXMLNodeList;
begin
result:=false;
try
v_xmlDocument:=NewXMLDocument(); //TXMLDocument.Create(nil);
v_xmlDocument.LoadFromFile(a_strNomFichier);
v_lstNoeuds:=v_xmlDocument.ChildNodes;
result:=LireNoeuds(v_lstNoeuds, a_objAffecte);
except
on ex: Exception do begin
TraitementErreur(ex);
end;
end;
end;

C'est à dire en utilisant l'interface "IXMLDocument" au lieu de la classe "TXMLDocument" et la méthode statique "NewXMLDocument" pour récupérer une instance. C'est quand même bizarre de proposer une classe si on peut pas l'instancier sans peaux de bananes à l'intérieur de l'objet.

Désolé d'avoir encombré le forum, j'espère toutefois que cette info sera utile à d'autres.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de gerbito
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
pour les nodes on utilise IXMLNode

pour le document on utilise TXMLDocument mais on crée TXMLDocument.Create(Application)


________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?
Commenter la réponse de f0xi