Suis je dans la bonne direction ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question<?xml version="1.0" encoding="utf-8"?> <MA> <Info datetime="2019-04-01T09:20:42" showfile="macbeth limoges-test" /> <Layers index="3"> <Layer index="1" name="gradateurs"> <Fixture index="0" name="Dim 68" fixture_id="68" channel_id="68"> <FixtureType name="2 Dimmer 00"> <No>2</No> </FixtureType> <SubFixture index="0" react_to_grandmaster="true" color="ffffff"> <Patch> <Address>143</Address> </Patch> <AbsolutePosition> <Location x="0" y="0" z="0" /> <Rotation x="0" y="-0" z="0" /> <Scaling x="1" y="1" z="1" /> </AbsolutePosition> <Channel index="0" /> </SubFixture> </Fixture>
Class Fixture Public Property Nom() As String Public Property Type() As String Public Property NomType() As String End Class
Private mesFixtures As List(Of Fixture) 'collection qui va recevoir les data Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Dim xDoc As XDocument = XDocument.Load("PATCH2.xml") 'dans cet exemple le fichier est placé dans le même répertoire que le logiciel mesFixtures = ( From f In xDoc.Descendants("Fixture")'f est un instance d'élément appelé "Fixture" Select New Fixture With { .Nom = f.Attribute("name")?.Value, ' les ? veulent dire si c'est pas null alors donne moi la suite sinon retourne null, .Type = f.Value, .NomType = f.Element("FixtureType")?.Attribute("name")?.Value }).ToList() 'on binde les résultats vers un datagridview, en supposant que tu es en Winform dataGridView1.DataSource = mesFixtures End Sub }
ok pour le débogage mais je trouvais que c'était plus facile comme ça.
Dim lignes As List(Of String) = File.ReadAllLines("PATCH.xml").ToList() 'on met toutes les lignes du fichier dans une lite lignes.RemoveAt(1) 'on enlève la ligne 1 (qui est la 2eme ligne) lignes.RemoveAt(1) 'on enlève la ligne 1 (qui est la 2eme ligne actuelle, soit la 3ème ancienne ligne) lignes(1) = "<MA>" 'on modifie la ligne 1 (qui est la 4eme ligne d'origine) Dim texteCorrige As String = String.Join(Environment.NewLine, lignes) 'on refait un texte complet Dim xDoc As XDocument = XDocument.Parse(texteCorrige) 'on parse le texte corrigé mesFixtures = ( From f In xDoc.Descendants("Fixture") Select New Fixture With { .Nom = f.Attribute("name")?.Value, .Type = f.Value, .NomType = f.Element("FixtureType")?.Attribute("name")?.Value }).ToList() DataGridView1.DataSource = mesFixtures
From f In xDoc.Descendants("Fixture")'f est un instance d'élément appelé "Fixture" Select New Fixture With { .Nom = f.Attribute("name")?.Value, ' les ? veulent dire si c'est pas null alors donne moi la suite sinon retourne null, .Type = f.Value, .NomType = f.Element("FixtureType")?.Attribute("name")?.Value }).ToList()
Class SubFixture Public Property PatchAdresse() As Integer Public Property Position() As Point3D Public Property Rotation() As Point3D Public Property Echelle() As Point3D End Class Friend Class Point3D Public Property X() As Double Public Property Y() As Double Public Property Z() As Double ''' <summary> ''' Cette méthode évite d'écrire 3fois la même chose dans la requete de désserialisation ''' </summary> ''' <param name="E"></param> ''' <returns></returns> Public Shared Function FromXML(ByVal E As XElement) As Point3D If E Is Nothing Then Return New Point3D() End If Return New Point3D With {.X = ToDouble(E.Attribute("x")?.Value), .Y = ToDouble(E.Attribute("y")?.Value), .Z = ToDouble(E.Attribute("z")?.Value)} End Function ''' <summary> ''' convertit en double peu importe le symbole décimal du PC et du texte ''' </summary> ''' <param name="Texte"></param> ''' <returns>Si ca ne marche pas retourne Not A Number</returns> Private Shared Function ToDouble(ByVal Texte As String) As Double Dim res As Double If Double.TryParse(Texte.Replace(","c, "."c),System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, res) Then Return res Else Return Double.NaN End If End Function End Class
mesFixtures = ( From f In xDoc.Descendants("Fixture") Select New Fixture With {.Nom = f.Attribute("name")?.Value, .Type = f.Value, .NomType = f.Element("FixtureType")?.Attribute("name")?.Value, .LesSubFixtures = ( From s In f.Descendants("SubFixture") Select New SubFixture With { .PatchAdresse = s.Element("Patch")?.Element("Address")?.Value IsNot Nothing ? Convert.ToInt32(s.Element("Patch")?.Element("Address")?.Value) : -1, .Position = Point3D.FromXML(s.Element("AbsolutePosition")?.Element("Location")), .Rotation = Point3D.FromXML(s.Element("AbsolutePosition")?.Element("Rotation")), .Echelle = Point3D.FromXML(s.Element("AbsolutePosition")?.Element("Scaling"))}).ToList()}).ToList()
Dim n1 As Integer = mesFixtures.Count(Function(f) f.LesSubFixtures.Count > 1) Dim n0 As Integer = mesFixtures.Count(Function(f) f.LesSubFixtures.Count = 0)
Dim pbImport As List(Of Fixture) = mesFixtures.Where(Function(f) f.LesSubFixtures.Any(Function(s) s.PatchAdresse = -1)).ToList()
Class Presets Public Property Name() As Integer Public Property SpecialUse() As String Public Property Channels() As Channels End Class Class Channels Public Property PresetValue As PresetValue Public Property Channel As Channel End Class Class PresetValue Public Property Handle() As Handle ' quand il y a le noeud HANDLE c'est qu'il y a une preset embeded Public Property Channel() As Channel End Class Class Handle Public Property Name() As Integer Public Property Numero() As Integer End Class Class Channel Public Property Fixture_id As Integer Public Property Attribut As String End Class
New Trucmuche With {'avec une accolade
4 avril 2019 à 15:58
J'ai essayé de transformer en fonction du lien que tu m'as donné.
J'ai mis ça mais Tbl_Patch ne fonctionne toujours pas.
Suis je dans la bonne direction ?