Acces aux valeurs dans un xml [Résolu]

Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
- - Dernière réponse : Whismeril
Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
- 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 ?
Afficher la suite 

Votre réponse

8/88 réponses

Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
358
0
Merci
Ha voilà
La classe Fixture doit être public
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
C'est bon ça marche !
Encore merci.
Reste à écrire la requête.
Whismeril
Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
358 -
Super
Commenter la réponse de Whismeril
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
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.
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
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 ?
Commenter la réponse de wholehog2
Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
358
0
Merci
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


Commenter la réponse de Whismeril
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
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 ?
Commenter la réponse de wholehog2
Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
358
0
Merci
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.
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
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
Commenter la réponse de Whismeril
Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
358
0
Merci
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

Commenter la réponse de Whismeril
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
PFFF c'est tout bête, j'aurais du le voir !
Commenter la réponse de wholehog2
Messages postés
13281
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 mai 2019
358
0
Merci
Le message d’erreur le disait assez clairement.
Impossible de caster une liste en une « pas liste »
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.