Acces aux valeurs dans un xml

Résolu
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019 - 4 avril 2019 à 12:00
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 17 mai 2019 à 20:21
Bonjour,

Je suis sous vb.net et je cherche a extraire des valeurs d'un fichier xml. J'arrive à récupérer 2 des 3 valeurs que j'ai besoin.
Le xml est de cette forme:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="styles/fixture+layer+layers@html@default.xsl"?>
<?xml-stylesheet type="text/xsl" href="styles/fixture+layer+layers@csv.xsl" alternate="yes"?>
<MA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.malighting.de/grandma2/xml/MA" xsi:schemaLocation="http://schemas.malighting.de/grandma2/xml/MA http://schemas.malighting.de/grandma2/xml/3.6.1/MA.xsd" major_vers="3" minor_vers="6" stream_vers="1">
<Info datetime="2019-04-01T09:20:42" showfile="macbeth-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>


Voila ce que j'ai codé:


Dim cpo_patch As XDocument = XDocument.Load(Lbl_patch.Text)
Dim popatch As XElement = cpo_patch.Root.<Layers>.FirstOrDefault
Dim listPatch As IEnumerable(Of XElement) = popatch.Elements()

For Each listfixture In listPatch

If listfixture.HasElements Then

Dim Fixtures As IEnumerable(Of XElement) = listfixture.Elements

Dim u As Integer = 0

For Each fixture In Fixtures

If fixture.HasElements Then

Tbl_Patch(u, 0) = fixture.@<channel_id>
Tbl_Patch(u, 1) = fixture.<fixturetype>.@<name>
Tbl_Patch(u, 2) = fixture.@<name>

MsgBox(Tbl_Patch(u, 0) & " / " & Tbl_Patch(u, 1) & " / " & Tbl_Patch(u, 2))

End If
Next

End If

Next


ce qui marche pas c'est fixture.<FixtureType>.@<name>

Avez vous des idées sur ce qui ne va pas ?

88 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
14 mai 2019 à 18:27
Ha voilà
La classe Fixture doit être public
0
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019
14 mai 2019 à 21:50
C'est bon ça marche !
Encore merci.
Reste à écrire la requête.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
15 mai 2019 à 03:25
Super
0
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019
Modifié le 16 mai 2019 à 22:24
Bonsoir,
De retour pour un autre souci.
Je cherche à faire une requete dans mesFixtures_Type mais j'ai une erreur.
voila ma requète:
Dim depuis = mesFixtures_Type.single(Function(x) x.Name = nom_du_fixturetype).Les_FT_Attributs.Depuis

qui me génère l'erreur :


j'ai déclaré mesFixtures_Type comme ça :
Public mesFixtures_Type

et j'ai passé les class en public.
0
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019
16 mai 2019 à 22:25
SUITE DU MESSAGE

j'ai essayé de la déclarer comme ça :
Public mesFixtures_Type As List(Of Fixture_Type)

mais j'ai une autre erreur à la place :




A ton avis qu'est ce qu'il ne va pas ?
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
16 mai 2019 à 22:50
Un
Select New With'...
crée un type anonyme, c'est à dire un type qui "n'existe pas". Ça sert dans une requête, ou entre 2 requêtes.

Fixture_Type est une classe, une propriété de classe ne peut pas être de type anomyne.
Tu as donc déclaré lesFtAttibuts comme une liste d'une autre classe, et dans la requête, il faut écrire le type de cette classe (toto pour l'exemple)
Select New toto With'...
là ça crée une instance de toto


0
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019
17 mai 2019 à 13:20
Bonjour,
C'est mieux mais il reste un souci.
J'ai modifié le select comme tu m'as expliqué mais je n'arrive pas à comprendre ce qui se passe pour .Les_FT_Attributs.

avec l'erreur :

Normalement, mesFixtures_Type est une liste dans une autre liste ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
17 mai 2019 à 14:20
A priori dans ta classe Fixture_Type, la propriété les_FT_Attributs n’est pas une liste.

PS: ce serait beaucoup simple pour moi avec ton code et pas une Image.
0
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019
17 mai 2019 à 16:56
Oui bien sur.

 Public mesFixtures_Type As List(Of Fixture_Type)


mesFixtures_Type =
            (
                    From FT In xDoc2.Descendants("FixtureType")
                    Select New Fixture_Type With
                        {
                        .Name = FT.Attribute("name")?.Value,
                        .Les_FT_Attributs = (From FT2 In FT.Descendants("ChannelType")
                                             Select New FT_Attributs With
                                                 {
                                                       .Attribute = FT2?.Attribute("attribute")?.Value,
                                                       .Depuis = FT2?.Element("ChannelFunction")?.Attribute("from")?.Value.ToDouble,
                                                       .Jusqua = FT2?.Element("ChannelFunction")?.Attribute("to")?.Value.ToDouble,
                                                       .Fine = FT2?.Attribute("fine")?.Value,
                                                       .Invert = FT2?.Attribute("invert")?.Value
                                                  }
                                             ).ToList()
                        }
            ).ToList()


Public Class Fixture_Type
    Public Property Name As String
    Public Property Les_FT_Attributs As FT_Attributs
End Class
Public Class FT_Attributs
    Public Property Attribute As String
    Public Property Depuis As Double   
    Public Property Jusqua As Double  
    Public Property Fine As Integer 
    Public Property Invert As String  
End Class
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
17 mai 2019 à 17:15
Public Class Fixture_Type
    Public Property Name As String
    Public Property Les_FT_Attributs As FT_Attributs'c'est là, cette propriété n'est pas une liste et dans la requête tu y entre une liste
End Class

0
wholehog2 Messages postés 58 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 17 mai 2019
17 mai 2019 à 17:41
PFFF c'est tout bête, j'aurais du le voir !
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
17 mai 2019 à 20:21
Le message d’erreur le disait assez clairement.
Impossible de caster une liste en une « pas liste »
0
Rejoignez-nous