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

Signaler
Messages postés
41
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
20 octobre 2015
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
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 !

2 réponses

Messages postés
41
Date d'inscription
mardi 14 décembre 2004
Statut
Membre
Dernière intervention
20 octobre 2015

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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
33
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 ?