Recherche et modification d'un node XML

Lus0rius Messages postés 26 Date d'inscription samedi 28 janvier 2017 Statut Membre Dernière intervention 29 juin 2021 - 3 nov. 2020 à 17:12
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 4 nov. 2020 à 19:04
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

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
3 nov. 2020 à 18:21
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
0
Lus0rius Messages postés 26 Date d'inscription samedi 28 janvier 2017 Statut Membre Dernière intervention 29 juin 2021
4 nov. 2020 à 14:07
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
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
4 nov. 2020 à 17:54
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
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
4 nov. 2020 à 17:56
Peux tu poster un exemple de xml source et le résulat attendu, avec les balises de codes
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
4 nov. 2020 à 19:04
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


0
Rejoignez-nous