Violation d'accès lors du parcours de l'arborescence d'un fichier XML

Résolu
gerbito Messages postés 39 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 20 octobre 2015 - 12 avril 2012 à 14:01
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 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 !

2 réponses

gerbito Messages postés 39 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 20 octobre 2015
12 avril 2012 à 14:12
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.
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
21 avril 2012 à 15:49
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 ?
0
Rejoignez-nous