Recherche et modification d'un node XML

Signaler
Messages postés
15
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
4 novembre 2020
-
Messages postés
15010
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 novembre 2020
-
Bonjour à tous,

J'aurais en réalité trois questions reliées à l'édition de XML en VB.NET :

1) J'ai de la peine à naviguer entre parents et descendants. Dans le code ci-dessous, je pars du node "firstnode", pour remonter jusqu'à un certain ancêtre et redescendre chercher le node "_height" (un grand-cousin éloigné de "firstnode"). Le code ici fonctionne, mais je voulais savoir s'il existait un moyen d'accéder plus rapidement au node "_height", par exemple en recherchant son nom dans tous les descendants de allchilds ou de child1.

Dim allchilds As XmlNodeList = firstnode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ChildNodes

For Each child1 As XmlNode In allchilds
    If child1.Name = "_properties" Then
        Dim child2 As XmlNodeList = child1.ChildNodes
        For Each child3 As XmlNode In child2
            Dim child4 As XmlNodeList = child3.ChildNodes
            For Each height As XmlNode In child4
                If height.Name = "_height" Then
                    height.InnerText = height.InnerText + 1.2806935
                End If
            Next
        Next
     End If
Next


2) Dans le code ci-dessus, j'effectue une opération mathématique sur la valeur du node height. Le problème est que cette opération transforme le point en virgule dans le résultat, et donc la valeur n'est plus reconnue. Comment faire pour garder le point ?

3) Enfin, en faisant un doc.Save(), le fichier xml perd ses tabulations qui sont remplacées par des espaces. J'ai bien essayé doc.PreserveWhitespace, mais celui-ci supprime purement et simplement les tabulations et regroupe tout le xml sur une seule ligne ! Je souhaiterais donc garder les tabulations...

Je m'excuse si cela fait beaucoup de questions d'un coup et vous remercie d'avance.
Lus0rius

3 réponses

Messages postés
15010
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 novembre 2020
450
Bonjour

Pour les xml je préfère linq to xml, peut-être que ça te conviendrait aussi
https://codes-sources.commentcamarche.net/faq/11196-linq-to-xml-c-et-vb-net
Messages postés
15
Date d'inscription
samedi 28 janvier 2017
Statut
Membre
Dernière intervention
4 novembre 2020

Merci pour ta réponse et pour le lien, j'avoue être un peu rebuté par Linq... est-ce qu'il me permettra de résoudre également mon problème de tabulations ? Car pour le moment j'ai rajouté ceci comme code, mais c'est assez lourd (il rallonge la prodécure d'environ 1/3 du temps, sachant que mon programme traite plusieurs dizaines voire centaines de fichiers xml) :
                'Correction du bug de tabulations
                Dim doc2 As String = File.ReadAllText(tilename)
                System.IO.File.Delete(tilename)
                Using docwriter As New StreamWriter(tilename, True)
                    docwriter.Write(doc2.Replace("  ", "	"))
                End Using
Messages postés
15010
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 novembre 2020
450
Normalement espace ou tabulation c'est la même chose pour les outils informatiques.
Ils sont normalement même capable de parser un fichier sur une seule ligne.

Du coup, je ne me suis jamais posé la question.

Je vais faire un test
Messages postés
15010
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 novembre 2020
450
Peux tu poster un exemple de xml source et le résulat attendu, avec les balises de codes
Messages postés
15010
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 novembre 2020
450
Ce code tout simple
Private Sub TestXML()
    Dim xDoc As XDocument = New XDocument()
    xDoc.Add(New XElement("Root", New XElement("Ligne1", "Valeur1"), New XElement("Ligne2", "Valeur2"), New XElement("Ligne3", "Valeur3"), New XElement("Ligne4", "Valeur4")))
    xDoc.Save("test.xml")
End Sub


Crée un fichier avec des espaces


Mais, on peut changer les changer en tabulation avant d'écrire le fichier, ce qui évite une écriture, une lecture et une nouvelle écriture.
Private Sub TestXML()
    Dim xDoc As XDocument = New XDocument()
    xDoc.Add(New XElement("Root", New XElement("Ligne1", "Valeur1"), New XElement("Ligne2", "Valeur2"), New XElement("Ligne3", "Valeur3"), New XElement("Ligne4", "Valeur4")))
    Dim texteTabule As String = xDoc.ToString().Replace("  ", vbTab)
    Dim fichierTabule As String = String.Format("<?xml version=""1.0"" encoding=""utf-8""?>" & vbCrLf & "{0}", texteTabule)
    File.WriteAllText("test2.xml", fichierTabule)
End Sub