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
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
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.
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
4 nov. 2020 à 14:07