LOUNIZARTE
Messages postés11Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 octobre 2010 6 déc. 2008 à 10:53
Ce post m'a été très utile dans mon travail, notamment pour réaliser un parseur qui traite 1 fichier xml très complexe dans sa structure (36 mbit).
J'ai pu réaliser 80% du parsage et à présent 1 blocage survient : Dès que la structure possède 4 niveau de noeuds hiérarchiques, la classe ne parvient plus à restituer les attributs demandés !
J'y réfléchit depuis pas mal de temps, mais sans succès. Si un d'entre vous accède à nouveau à ce post et à une idée sur ce blocage je lui en serait millle fois reconnaissant.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2008 à 14:02
si tu demande le ChildNodes (literalement, les noeuds-enfants) de ton doc XML, ok, ca va pas le faire...
mais en demandant les ChildNodes du noeud bTestMode ...
il te listeras les sous-noeuds un par un
skibadge
Messages postés9Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention20 juin 2008 20 juin 2008 à 13:50
pour la lecture d'un sous noeuf "ligne de commentaire":
<!-- 1:Test mode / 0:Production mode -->
tu m'a conseillé d'utiliser .ChildNodes mais dand ce cas cela me retourne uniquement la ligne de commentaire du début du fichier XML:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
mais ne te prend pas la tête ton aide m'a été précieuse. et la lecture des commentaires ne m'est pas indispensable, c'était juste histoire d'aller au bout des utilisations des XML
encore merci
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2008 à 12:31
j'ai pas pigé:
"mais pour la lecture childnotes je n'arive qu'lire la 1 er ligne de commentaite <?xml version etc..."
skibadge
Messages postés9Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention20 juin 2008 20 juin 2008 à 11:57
Encore moi.
pour l'écriture sans éffacer les commentaire c'est bon, nickel merci
mais pour la lecture childnotes je n'arive qu'lire la 1 er ligne de commentaite <?xml version etc...
mais c'est pas grave le principal etant de ne pas perdre les commentaires dés que j'écrivai
encore MerciIIIII beaucoup.
skibadge
Messages postés9Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention20 juin 2008 20 juin 2008 à 10:46
merci bc pour ta reactivité et tes details je regarde ca de pres ,j'essaie et te tien au courant merci
au fait une note pour la classe fournie
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2008 à 10:43
on lit ce sous noeud comme n'importe quel autre noeud ^^
en parcourante .ChildNodes, par exemple...
dans une XPath, on le demandera en ajoutant text() comme nom de noeud... (voir exemple de code ci-dessus)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2008 à 10:42
voilà une facon de procéder:
Private Sub Form_Load()
Dim oXML As DOMDocument
Set oXML = New DOMDocument
oXML.Load App.Path & "\a.xml"
Public Property Get XMLNodeText(ByRef voXML As DOMDocument, ByRef vsParent As String, ByRef vsNodeName As String) As String
Dim oNode As IXMLDOMNode
If Not Nothing Is voXML Then
Set oNode = voXML.selectSingleNode(vsParent & "/" & vsNodeName & "/text()")
If Not Nothing Is oNode Then
XMLNodeText = oNode.Text
End If
End If
End Property
Public Property Let XMLNodeText(ByRef voXML As DOMDocument, ByRef vsParent As String, ByRef vsNodeName As String, ByRef Value As String)
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
If Not Nothing Is voXML Then
Set oNode = voXML.selectSingleNode(vsParent & "/" & vsNodeName)
If Nothing Is oNode Then
'# Le noeud n'existe pas, on va le créer.
Set oNode = voXML.createNode(XMLELEMTYPE_TEXT, vsNodeName, vbNullString)
voXML.selectSingleNode(vsParent).appendChild oNode
End If
'# On cherche le texte contenu
Set oChild = oNode.selectSingleNode("text()")
If Nothing Is oChild Then
'# Il n'existe pas ? on ajoute un sous-noeud texte (et on preserve ainsi les autres sous-noeud (les commentaires, par exemple)
Set oChild = oNode.appendChild(voXML.createTextNode(Value))
Else
oChild.Text = Value
End If
End If
End Property
skibadge
Messages postés9Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention20 juin 2008 20 juin 2008 à 10:40
ok mais comment lire ce sous noeud de commentaire sans en connaitre le contenu car il est créer pas un autre programme et peut etre modifié pour une meilleure explication.
alors que "bTestMode" ne changera pas.
ce sous noeud pas pas de fin de sous noeud es normal.
merci
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2008 à 10:28
en fait, ton noeud bTestMode contient un sous noeud Text "0" et un sous noeud commentaire "<!-- 1:Test mode / 0:Production mode -->"
en modifiant la propriété Text de ton noeud bTestMode, tu supprime ces sous noeuds...
skibadge
Messages postés9Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention20 juin 2008 20 juin 2008 à 09:51
si avec la classe du zip je fait :
FileXMLTest.EcrireValeur ("Parameters bTestMode","1")
cela me passe bien bTestMode à 1 mais "!-- 1:Test mode / 0:Production mode -->" a disparu.
Encore merci pour l'aide apporté
ollivier
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juin 2008 à 09:41
quel est le code que tu utilises ?
skibadge
Messages postés9Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention20 juin 2008 20 juin 2008 à 09:36
Salut, merci pour ta source, elle m'a permis de débuter le XML.
mais j'ai juste un petit probleme, dont ma question
losque j'ecris dans un XML existant conportant des commentaires du style:
<!-- Connected devices -->
cette ligne de commentaire est effacée et je ne trouve pas pourquoi, ni comment la lire avant de modifier le noeuf et pouvoir la réecrire avant de sauver.
merci d'avance et encore bravo pour l'aide qu'apportent les sources de ce site
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 12 avril 2006 à 11:04
Ah oui. Je n'avais pas vu ce détail parce que je ne l'utilise pas pour internet mais comme fichier de config.
cs_jbel
Messages postés5Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention11 avril 2006 11 avril 2006 à 12:40
Je n'en suis pas certain, mais de ce que j'ai entendu ça sert a être compatible pour tous les navigateurs, grâce aux infos de la version (suivant les versions le code peut être interprété différemment) et l'encodage pour d'éventuels caractères "bizarre".
En fait c'est juste pour avoir un fichier le plus propre possible au final.
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 10 avril 2006 à 18:52
Et merci pour ta solution. Mais ... ça te sert à quoi ?
cs_jbel
Messages postés5Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention11 avril 2006 10 avril 2006 à 16:35
Voilà comment on peut créer l'entête du fichier XML en ajoutant ce bout de code dans le sub "Ouvrir" (Avant la création du premier noeud)
Merci encore pour ta source... elle m'est très utile!
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 8 avril 2006 à 11:30
Je suis sur que ça existe mais je ne me rappel plus où.
cs_jbel
Messages postés5Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention11 avril 2006 7 avril 2006 à 20:04
Ah ok, bizarre chez moi rien ne s'inscrit... enfin bon, je regarderai ça plus en détail lundi! Un week-end chargé s'annonce.
Si jamais tu trouves quelque chose d'ici là, je suis quand même preneur :)
Bon week-end!
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 7 avril 2006 à 19:53
De mémoire elle se met par défaut à la création de la racine.
cs_jbel
Messages postés5Date d'inscriptionmercredi 30 avril 2003StatutMembreDernière intervention11 avril 2006 7 avril 2006 à 18:31
Salut, merci pour ta source, elle m'a été très utile.
Comme je débute dans le XML, je ne suis pas sûr d'avoir tout compris encore. Je maîtrise les concepts d'insertion de balises et de valeurs mais j'aurais voulu savoir si on pouvait aussi insérer une en-tête dans le genre:
<?xml version="1.0" encoding="UTF-8" ?>
(...que j'ai récupéré sur un autre fichier .xml)
Et si oui, comment?
Merci d'avance et bonne continuation!
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 11 nov. 2005 à 11:57
Moi non plus. En fait je viens de trouver. C'était quand je changeait de feuille appelant la class. J'ai simplement augmenter la portée de l'appelant.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 9 nov. 2005 à 16:35
je n'ai même pas été avertit de l'update :o
"quand tu changes de feuille" ??
qu'entends-tu par là ?
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 9 nov. 2005 à 16:14
Salut,
J'ai un problème avec le suivi de mes variables.
Je perd le contenu des variables XMLChemin et XMLPremierNoeud dés que je change de feuille.
Y a t-il une solution pour les conserver ?
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 8 nov. 2005 à 10:52
La lecture des noeuds multiples stocke les valeurs et les attributs dans 2 tableaux (ListeVal et listeAttr).
Je souhaiterais faire des tableaux de taille quelcqonque et les redimmensionner à la fin de la lecture. Est-ce possible ?
Je pense finalement refaire tout ça en utilisant la suggestion de renfield pour une gestion plus souple.
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 8 nov. 2005 à 09:41
Oui Renfield tu as raison. Je me suis posé la question. Mais 1 je suis débutant (du moins en module de classe) et 2, je cherchait la souplesse dans l'utilisation. Chaque commande fait donc tout.
Ceci dit pas impossible que je le fasse un jour.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 8 nov. 2005 à 07:30
Ajoutes le Option Explicit, mon pote Jack à raison, ca t'éviteras bien des soucis.
Je trouve dommage cette optique, consommatrice au niveau perf...
je parle du fait de rouvrir a chaque ajout de noeud tout le fichier XML...
Tu pourrais raccourcir ton code, et tirer pleinement profit de l'utilisation d'un module de classe, qui ne se justifie aucunement pour le moment.
Enfin, ce n'est que mon point de vue ^^
Multiples accès au disque, (lecture/écriture du fichier à chaque ajout de qq chose)
Parsing répété du flux... pas top
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 6 nov. 2005 à 19:46
lol, ca te compliques la vie, peut-être :
Avec Option Explicit, tu es obligé de déclarer chaque variable. Ok, mais :
- Tu n'auras plus de conflit ou de bug lié aux conversions, la recompilation avant exécutation te le dira de suite.
- Ca permets d'être plus strict avec les variables et ainsi de gagner du temps d'exécution sur les gros projets
- Puisque chaque variable doit être déclarée, tu finis par apprendre à gérer l'étendue des variables et à éviter qu'une variable ne garde pas de données qui peuvent devenir gènantes plus tard.
C'est comme une hygiène vie du programmeur que de s'obliger à être rigoureux
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 6 nov. 2005 à 18:51
Merci pour ton commentaire.
Je me suis tjs demandé à quoi servait la déclaration explicit si ce n'est à compliquer le boulot du codeur.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 6 nov. 2005 à 18:45
Ok, merci, je venais d'arriver à la même conclusion après m'être renseigné.
MSXLM4 est installé sur les produits XP SP2 et Office 2003.
J'ai ni l'un ni l'autre, d'où l'erreur.
Il manque quelques déclarations dans ton projet (Classe) dès qu'on utilise Option Explicit, ce que je te conseille surtout avec ce genre d'application qui gère de la donnée.
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 6 nov. 2005 à 18:07
6 déc. 2008 à 10:53
J'ai pu réaliser 80% du parsage et à présent 1 blocage survient : Dès que la structure possède 4 niveau de noeuds hiérarchiques, la classe ne parvient plus à restituer les attributs demandés !
J'y réfléchit depuis pas mal de temps, mais sans succès. Si un d'entre vous accède à nouveau à ce post et à une idée sur ce blocage je lui en serait millle fois reconnaissant.
20 juin 2008 à 14:02
mais en demandant les ChildNodes du noeud bTestMode ...
il te listeras les sous-noeuds un par un
20 juin 2008 à 13:50
<!-- 1:Test mode / 0:Production mode -->
tu m'a conseillé d'utiliser .ChildNodes mais dand ce cas cela me retourne uniquement la ligne de commentaire du début du fichier XML:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
mais ne te prend pas la tête ton aide m'a été précieuse. et la lecture des commentaires ne m'est pas indispensable, c'était juste histoire d'aller au bout des utilisations des XML
encore merci
20 juin 2008 à 12:31
"mais pour la lecture childnotes je n'arive qu'lire la 1 er ligne de commentaite <?xml version etc..."
20 juin 2008 à 11:57
pour l'écriture sans éffacer les commentaire c'est bon, nickel merci
mais pour la lecture childnotes je n'arive qu'lire la 1 er ligne de commentaite <?xml version etc...
mais c'est pas grave le principal etant de ne pas perdre les commentaires dés que j'écrivai
encore MerciIIIII beaucoup.
20 juin 2008 à 10:46
au fait une note pour la classe fournie
20 juin 2008 à 10:43
en parcourante .ChildNodes, par exemple...
dans une XPath, on le demandera en ajoutant text() comme nom de noeud... (voir exemple de code ci-dessus)
20 juin 2008 à 10:42
Private Sub Form_Load()
Dim oXML As DOMDocument
Set oXML = New DOMDocument
oXML.Load App.Path & "\a.xml"
MsgBox "bTestMode= " & XMLNodeText(oXML, "/Config/Parameters", "bTestMode"), vbInformation
Randomize
XMLNodeText(oXML, "/Config/Parameters", "bTestMode") = CLng(Rnd * 10)
MsgBox "bTestMode= " & XMLNodeText(oXML, "/Config/Parameters", "bTestMode"), vbInformation
oXML.save App.Path & "\a.sav.xml"
End Sub
Public Property Get XMLNodeText(ByRef voXML As DOMDocument, ByRef vsParent As String, ByRef vsNodeName As String) As String
Dim oNode As IXMLDOMNode
If Not Nothing Is voXML Then
Set oNode = voXML.selectSingleNode(vsParent & "/" & vsNodeName & "/text()")
If Not Nothing Is oNode Then
XMLNodeText = oNode.Text
End If
End If
End Property
Public Property Let XMLNodeText(ByRef voXML As DOMDocument, ByRef vsParent As String, ByRef vsNodeName As String, ByRef Value As String)
Dim oNode As IXMLDOMNode
Dim oChild As IXMLDOMNode
If Not Nothing Is voXML Then
Set oNode = voXML.selectSingleNode(vsParent & "/" & vsNodeName)
If Nothing Is oNode Then
'# Le noeud n'existe pas, on va le créer.
Set oNode = voXML.createNode(XMLELEMTYPE_TEXT, vsNodeName, vbNullString)
voXML.selectSingleNode(vsParent).appendChild oNode
End If
'# On cherche le texte contenu
Set oChild = oNode.selectSingleNode("text()")
If Nothing Is oChild Then
'# Il n'existe pas ? on ajoute un sous-noeud texte (et on preserve ainsi les autres sous-noeud (les commentaires, par exemple)
Set oChild = oNode.appendChild(voXML.createTextNode(Value))
Else
oChild.Text = Value
End If
End If
End Property
20 juin 2008 à 10:40
alors que "bTestMode" ne changera pas.
ce sous noeud pas pas de fin de sous noeud es normal.
merci
20 juin 2008 à 10:28
en modifiant la propriété Text de ton noeud bTestMode, tu supprime ces sous noeuds...
20 juin 2008 à 09:51
<Config>
<!--Parameters-->
0<!-- 1:Test mode / 0:Production mode -->
<\Config>
si avec la classe du zip je fait :
FileXMLTest.EcrireValeur ("Parameters bTestMode","1")
cela me passe bien bTestMode à 1 mais "!-- 1:Test mode / 0:Production mode -->" a disparu.
Encore merci pour l'aide apporté
ollivier
20 juin 2008 à 09:41
20 juin 2008 à 09:36
mais j'ai juste un petit probleme, dont ma question
losque j'ecris dans un XML existant conportant des commentaires du style:
<!-- Connected devices -->
cette ligne de commentaire est effacée et je ne trouve pas pourquoi, ni comment la lire avant de modifier le noeuf et pouvoir la réecrire avant de sauver.
merci d'avance et encore bravo pour l'aide qu'apportent les sources de ce site
12 avril 2006 à 11:04
11 avril 2006 à 12:40
En fait c'est juste pour avoir un fichier le plus propre possible au final.
10 avril 2006 à 18:52
10 avril 2006 à 16:35
Call ModClsXML.appendChild(ModClsXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" "))
Merci encore pour ta source... elle m'est très utile!
8 avril 2006 à 11:30
7 avril 2006 à 20:04
Si jamais tu trouves quelque chose d'ici là, je suis quand même preneur :)
Bon week-end!
7 avril 2006 à 19:53
7 avril 2006 à 18:31
Comme je débute dans le XML, je ne suis pas sûr d'avoir tout compris encore. Je maîtrise les concepts d'insertion de balises et de valeurs mais j'aurais voulu savoir si on pouvait aussi insérer une en-tête dans le genre:
<?xml version="1.0" encoding="UTF-8" ?>
(...que j'ai récupéré sur un autre fichier .xml)
Et si oui, comment?
Merci d'avance et bonne continuation!
11 nov. 2005 à 11:57
9 nov. 2005 à 16:35
"quand tu changes de feuille" ??
qu'entends-tu par là ?
9 nov. 2005 à 16:14
J'ai un problème avec le suivi de mes variables.
Je perd le contenu des variables XMLChemin et XMLPremierNoeud dés que je change de feuille.
Y a t-il une solution pour les conserver ?
8 nov. 2005 à 10:52
Je souhaiterais faire des tableaux de taille quelcqonque et les redimmensionner à la fin de la lecture. Est-ce possible ?
Je pense finalement refaire tout ça en utilisant la suggestion de renfield pour une gestion plus souple.
8 nov. 2005 à 09:41
Ceci dit pas impossible que je le fasse un jour.
8 nov. 2005 à 07:30
Je trouve dommage cette optique, consommatrice au niveau perf...
je parle du fait de rouvrir a chaque ajout de noeud tout le fichier XML...
Tu pourrais raccourcir ton code, et tirer pleinement profit de l'utilisation d'un module de classe, qui ne se justifie aucunement pour le moment.
Enfin, ce n'est que mon point de vue ^^
Multiples accès au disque, (lecture/écriture du fichier à chaque ajout de qq chose)
Parsing répété du flux... pas top
6 nov. 2005 à 19:46
Avec Option Explicit, tu es obligé de déclarer chaque variable. Ok, mais :
- Tu n'auras plus de conflit ou de bug lié aux conversions, la recompilation avant exécutation te le dira de suite.
- Ca permets d'être plus strict avec les variables et ainsi de gagner du temps d'exécution sur les gros projets
- Puisque chaque variable doit être déclarée, tu finis par apprendre à gérer l'étendue des variables et à éviter qu'une variable ne garde pas de données qui peuvent devenir gènantes plus tard.
C'est comme une hygiène vie du programmeur que de s'obliger à être rigoureux
6 nov. 2005 à 18:51
Je me suis tjs demandé à quoi servait la déclaration explicit si ce n'est à compliquer le boulot du codeur.
6 nov. 2005 à 18:45
MSXLM4 est installé sur les produits XP SP2 et Office 2003.
J'ai ni l'un ni l'autre, d'où l'erreur.
Il manque quelques déclarations dans ton projet (Classe) dès qu'on utilise Option Explicit, ce que je te conseille surtout avec ce genre d'application qui gère de la donnée.
6 nov. 2005 à 18:07
(le téléchargement est sur la page en anglais
ou changer les 3 ou 4 déclarations dans la version que tu as.
Actuellement je debug en utilisant. Donc il y aura rapidemment des mise à joour
6 nov. 2005 à 17:57
Il manque la référence à un objet nommé "DOMDocument40"
C'est quoi ?