Gestion grâce à un xml

[Résolu]
Signaler
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013
-
 Utilisateur anonyme -
Bonjour tout le monde, je développe actuellement un programme en VB.NET et j'ai besoin d'utiliser un fichier xml distant hébergé sur un serveur. Le fichier aurait à peu près cette structure:
<?xml version="1.0" encoding="UTF-8"?>
<files>
    
        <sha1>97d06d1f590d8ce7c3b4b1f786ac3ea2c9352d44</sha1>
    


    <file>
        <filename>calques_couleur.png</filename>
        <sha1>b7d23a540a7cda882dab7bf2f7c1207365e82ec1</sha1>
    </file>
    <file>
        <filename>calques_opacite.png</filename>
        <sha1>031775fbbb45c154f7c9911f3b482ecf5a9c280f</sha1>
    </file>
</files>


Ne m'y connaissant pas du tout dans la gestion XML en VB.NET j'aurai aimé avoir des conseils pour comment réaliser une lecture du fichier XML de cette structure et pouvoir exécuter des actions en fonction de celui-ci (exemple, si le filename n'existe pas dans le répertoire local envoyer un message d'erreur, ou si il existe mais que le hash est différent envoyer aussi un message d'erreur).

Cordialement.

16 réponses


Bonsoir,

L'écriture d'un xml avec ta méthode est très délicate.
Personnellement, j'utiliserais XmlTextWriter qui est bien plus simple à manipuler.

Cependant, pour créer un xml semblable à celui de ton 1er post ci-dessus, tu peux faire comme ceci :

        Dim XmlDoc As XmlDocument = New XmlDocument()
        Dim declaration As XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)

        Dim files As XmlNode = XmlDoc.CreateNode("element", "files", "")

        Dim principal As XmlNode = XmlDoc.CreateNode("element", "principal", "")
        Dim node As XmlNode = XmlDoc.CreateNode("element", "sha1", "")
        node.InnerText = "10000"
        principal.AppendChild(node)

        files.AppendChild(principal)

        For x = 0 To 3
            Dim file As XmlNode = XmlDoc.CreateNode("element", "file", "")

            Dim node1 As XmlNode = files.AppendChild(file)

            Dim filename As XmlNode = XmlDoc.CreateNode("element", "filename", "")
            filename.InnerText = x.ToString

            Dim sha1 As XmlNode = XmlDoc.CreateNode("element", "sha1", "")
            sha1.InnerText = (x + 100).ToString

            node1.AppendChild(filename)
            node1.AppendChild(sha1)

            files.AppendChild(node1)
        Next

        XmlDoc.AppendChild(files)

        XmlDoc.InsertBefore(declaration, files)


        XmlDoc.Save("monfichier.xml")
        MsgBox("Enregistrement réussi")


Bonne soirée.
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

Tu peux t'intéresser à System.Xml ou Linq To XML.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Merci de vos réponses, avec cette doc il y a largement moyen de se débrouiller :)

Néanmoins j'ai une question, je charge mon XML de cette façon:
XmlDoc.Load("http://www.monsite.fr/test.xml")

Mais cela prend environ 5 secondes alors que pour l'instant le fichier est tout petit, n'y a-t-il pas moyen d'optimiser ceci ?

Merci d'avance.
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

Est-ce que tu comptes le temps de téléchargent du fichier ?
Cer si le serveur mets un peu de temps pour répondre, ça reste logique.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Oui les 5 secondes est composé en grande partie du temps de téléchargement du fichier je pense. Mais je trouve bizarre que via l'application le serveur a toujours un temps de réponse relativement long (fichier doit faire 5 ko à tout casser) alors que les téléchargements via un explorateur internet par exemple se lancent immédiatement. N'y a-t-il donc pas quelque chose à rajouter pour que le temps qui s'écoule entre la requête au serveur et l'envoie du fichier soit réduit au maximum ?
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

Je ne pourrais pas te répondre à cette question, cela dépasse mes compétences.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Pour ce qui est de la lecture XML pas de problème j'ai trouvé mais bonheur mais par contre pour ce qui est de la création de XML j'ai quelques difficultés. J'ai essayé de prendre l'exemple qui est sur un des liens, ce qui donne ceci:
        Dim XmlDoc As XmlDocument = New XmlDocument()
        Dim elemSite As XmlElement
        elemSite = XmlDoc.CreateElement("SITE")

        'creation et definition de la balise url (enfant)
        Dim elemUrl As XmlElement
        elemUrl = XmlDoc.CreateElement("URL")
        elemUrl.InnerText = " http://www.peuw.net/index.xml "

        'creation et definition de la balise Nom (enfant)
        Dim elemNom As XmlElement
        elemNom = XmlDoc.CreateElement("NOM")
        elemNom.InnerText = "peuw.net"

        'ajout des 2 balise enfants a la balise parent 
        elemSite.AppendChild(elemUrl)
        elemSite.AppendChild(elemNom)

        'on ajoute la balise parent au document
        XmlDoc.DocumentElement.AppendChild(elemSite)

        'Ecriture du Xml
        XmlDoc.Save(Application.StartupPath & "Newsite.XML")
        MsgBox("Enregistrement réussi")

Bien qu'il n'y ait aucune erreur lorsque je lance le debug du programme, celui ci s'arrête à la ligne:
XmlDoc.DocumentElement.AppendChild(elemSite)

Et m'envoie cette erreur là:
Object reference not set to an instance of an object.

Je ne vois pas du tout d'où ça vient étant donné que elemSite a bien été déclaré en tant qu'élément XML. Si quelqu'un pourrait me renseigner sur d'où vient le problème où m'orienter vers une autre méthode fonctionnelle j'en serais heureux.

Cordialement.
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

L'erreur peut aussi venir de : XmlDoc.DocumentElement

Sinon, j'ai l'habitude d'utiliser un fichier XML en ressource pour avoir une base.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Merci de vos réponses,
l'erreur vient en effet de
XmlDoc.DocumentElement

qui est dans la ligne :
XmlDoc.DocumentElement.AppendChild(elemSite)

Puisque AppendChild(variable) marche bien pour les balises URL et NOM qui sont enregistrées dans l'élément SITE (observé grâce à des tests), c'est l'écriture de la balise SITE qui contient les deux précédentes (URL et NOM) dans le fichier xml qui pose problème.
Quelqu'un sait-il ce que signifie cette erreur :
Object reference not set to an instance of an object.

Je ne vois pas d'où vient l'erreur, DocumentElement ne doit pas être déclaré pourtant je pense...

Cordialement.
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

A la place de :
XmlDoc.DocumentElement.AppendChild(elemSite)

Fais :
XmlDoc.AppendChild(elemSite)


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Petite question aussi qui n'a pas trop de rapport, savez vous comment lancer un .bin avec Process.Start ?
J'utilise Shell et cela marche bien mais c'est du VB6 et pas du VB.NET donc si quelqu'un savait comment lancer un fichier .bin avec Process.Start ça serait pas mal. Pour l'instant ça l'ouvre dans mon cas avec VLC (media player) qui ouvre par défault sur mon OS les fichiers .bin alors qu'avec la commande Shell il s'ouvre bien comme un exécutable.

Cordialement.
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

Un .Bin n'est pas un exécutable standard.
Il s'agit d'un fichier binaire, pas forcément exécutable.
Il s'ouvre comme on ouvrirait un fichier TXT, DOC ou MP3, avec une application externe.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Messages postés
39
Date d'inscription
lundi 15 août 2011
Statut
Membre
Dernière intervention
17 juillet 2013

Bonsoir, je vais me contenter de la méthode Shell qui marche bien, sinon j'aurai aimé savoir si il y avait une fonction pour comparer deux XML (de structure semblable), j'ai entendu parler de xml diff sans vraiment trouver quelque chose. De mon côté j'ai essayé de bricoler quelque chose mais je ne suis pas encore satisfait du résultat.
Cordialement.
Messages postés
14823
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
9 octobre 2021
156
Bonjour,

Je ne connais (et je n'ai jamais cherché) pas d'outils faisant cela, dsl.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site

Bonsoir,

Si ces XML sont créés par ton application, la méthode que j'utiliserais consisterait à sérialiser (fabriquer un xml) ou dé-sérialiser (lire un xml) une classe contenant des données.
Il sera alors très facile de comparer les données stockées dans les différentes instances de la même classe après dé-sérialisation. (pour chaque instance : un xml distinct)

Bonne prog.