Lus0rius
Messages postés26Date d'inscriptionsamedi 28 janvier 2017StatutMembreDernière intervention29 juin 2021
-
3 nov. 2020 à 17:12
Whismeril
Messages postés18416Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 juin 2023
-
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
Lus0rius
Messages postés26Date d'inscriptionsamedi 28 janvier 2017StatutMembreDernière intervention29 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
Whismeril
Messages postés18416Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 juin 2023624 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
Whismeril
Messages postés18416Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 juin 2023624 4 nov. 2020 à 17:56
Peux tu poster un exemple de xml source et le résulat attendu, avec les balises de codes
Whismeril
Messages postés18416Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 1 juin 2023624 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
4 nov. 2020 à 14:07