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
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 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 

8/88 réponses

Meilleure réponse
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
1
Merci
Bonjour l’objet XDocument et ses « enfants » XElment et XAttribut ont été conçus pour Linq to Xml, donc pas de la façon dont tu as codé.
Un petit tuto ici
https://codes-sources.commentcamarche.net/faq/11196-linq-to-xml-c-et-vb-net

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CodeS-SourceS

Codes Sources 185 internautes nous ont dit merci ce mois-ci

wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
merci d'avoir répondu.

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.
 
For Each fixture In Fixtures

        If fixture.HasElements Then

Tbl_Patch(u, 0) = fixture.Attribute("channel_id").Value
Tbl_Patch(u, 1) = fixture.Element("Fixturetype").Attribute("Name").Value
Tbl_Patch(u, 2) = fixture.Attribute("name").Value

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

         End If
  Next

Suis je dans la bonne direction ?
Commenter la réponse de Whismeril
Messages postés
6270
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
13 octobre 2019
87
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Bonjour le pivert, ton article ne parle pas de la même methode de parsage.
Commenter la réponse de cs_Le Pivert
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Suis je dans la bonne direction ?


Vu que
  • VB.Net est un langage objet,
  • linq est un système de requetage fait pour travailler avec des collections d'objets,
  • tu utilises un tableau à 2 dimensions
  • tu fais un for each et un If,

franchement non.
En plus tu mélanges VB6 et VB.Net, c'est pas super conseillé (voir ici https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net )

Je ne suis pas certain de ce que tu veux faire et comme ton xml est mal formaté (sur le site), je ne peux pas essayer.

Mais si tu as 200 fixtures, alors tu vas avoir 200 messages, et un seul enregistrement (u ne change jamais).


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Je te l'accorde, je ne suis pas développeur et j'en suis loin ! , j'ai des notions de vb qui me permettent de faire (quand ça marche) des petits programmes qui me sont utiles.
J'ai volontairement troqué le fichiers xml car effectivement il doit contenir presque 200 fixtures, du coup trop grand pour mettre sur le forum. Voici un lien pour le télécharger :
https://drive.google.com/file/d/1Pb8IVCZGmPP2Usn1KE42Q-700hMnDGAt/view?usp=sharing

Je reformule ce que je souhaite faire au cas ou je me sois mal exprimé.
Je souhaite récupérer les valeurs suivantes pour chaque fixture dans un fichier xml :

<Fixture>.<name>
<Fixture>.<fixture_id>
<Fixture>.<FixtureType>.<name>
p.s.(cette notation est une représentation de ce que je veux récupérer)

pour les mettre ensuite dans un tableau. J'ai ajouté une messagebox pour afficher ce que j'arrivais à récupérer, elle sera évidement supprimé par la suite.

Effectivement j'ai oublié d'incrémenter u dans ma boucle.

Peux tu me donner un exemple de ce que je dois obtenir ?
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Ton xml est mal formaté, d'abord parce que tu n'as pas précisé à la coloration que c'est du xml.
Voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Y'a un truc qui ne plait pas à Linq dans ton fichier.

Si j'espionne un fichier de test, j'obtiens ça


Avec le tiens


Je n'ai pas le temps d'y regarder plus avant ce soir.

PS, j'ai codé en C#, mais VB.Net c'est du C# déguisé en VB.
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
Merci de intéresser à mon problème.
Effectivement il y a un souci avec le xml, j'ai vérifié le fichier sur drive il est identique à celui sur mon disque. Peut être devrais tu essayé de la retélécharger au cas ou.
De mon coté je vérifie demain ce que ça donne sur visual studio.

p.s. j'ai cherché comment éditer mon premier post pour passer le code en xml mais je n'ai pas trouvé
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Bonjour, on peut éditer son propre post pendant 1h à partir du dépôt.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Apparement, c'est les lignes 2 à 4 qui ne plaisent pas à Linq (et je ne sais pas pourquoi), si on fait le ménage de cette façon (à la main pour l'instant)
<?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>


ça marche.

La classe qui va recevoir les données
Class Fixture
		Public Property Nom() As String

		Public Property Type() As String

		Public Property NomType() As String

	End Class


Je suppose que tu es en Winform et pour l'exemple il y a un datagridview sur le form.
Le code est lancé depuis un bouton.
		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
   }


Attention, enlève les commentaires (qui sont là pour t'expliquer) de la requête, sinon ça ne marchera pas.


Autre chose, on ne déboggue pas avec des messagesBox, il y a des outils exprès pour
https://openclassrooms.com/fr/courses/1526901-apprenez-a-developper-en-c/2867766-utilisez-le-debogueur/
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
Oui je suis en winform.

Effectivement en enlevant les lignes 2 et 3 ça marche. Ces lignes servent à la présentation du fichier xml avec une feuille de style xsl.
Du coup est-ce que je dois modifier le xml avant de le lire ? ou y a t'il une autre solution ? (idée ; définir la racine du xml sur le nœud <layers>)

ok pour le débogage mais je trouvais que c'était plus facile comme ça.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
ok pour le débogage mais je trouvais que c'était plus facile comme ça.

Et non, avec un point d’arrêt et les outils, tu tout voir.
Et puis une fois que tu as compris ce qui ne va pas tu enlève le point d’arrêt et t’as pas à cliquer sur 131 messagebox....

Pour ton fichier, je pense que le plus simple est effectivement de le modifier.
Je te montre ça plus tard dans la journée.
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
Oui c'est vrai que ça fait beaucoup appuyer sur la touche "entrer", je vais m'habituer avec les outils de débogage de visual studio se sera mieux.

En attendant ta solution pour le fichier, je vais voir ce que j'arrive à faire.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
        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

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
super, merci encore ça fonctionne comme je voulais.

Une petite question en bonus :
si dans mon xml j'avais voulu récupérer les valeurs de <fixture><subfixture><absoluteposition><location><X> comment aurais je du procéder ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ça dépend de comment tu dois ensuite le traiter, l'utiliser.
  • est-ce dépendant du fixture?
    • oui, doit-être dans l'objet fixture
      • dans le xml, c'est un "sous ensemble", est-ce le cas pour le traitement
        • non, propriété de type de base
        • oui, propriété d'une classe dédiée
      • peut-il y en avoir plusieurs dans un fixture
        • oui
          • nombre fixe
          • nombre variable
    • non, doit-être dans un autre objet-> classe dédié


Par exemple, un carnet de contact (pour les collections)
La classe contact a pour propriété nom, prénom, surnom, date de naissance, société.
Arrivent les numéros de téléphone,
  • est-ce que je crée pleins de propriétés fixeMaison, fixeBureau, portableMaison, portableBureau, faxBureau, télex, bippeur, etc....
    • il faut être super exhaustif (c'est compliqué, et on va se retrouver avec "50" propriétés quasi identiques) et on n'autorise pas l'avenir (un codeur de carnet de contact des années 80 avait il anticipé les smartphone double sim?)
  • ou alors est-ce que je crée une classe "Téléphone" avec une propriété numéro, une propriété device (fixe, mobile, bippeur, fax, etc..) et une propriété type (perso, bureau, voiture etc...).
    • Là on dispose d'une collection, dont on peut moduler les enregistrement "à l'infini"

Et le problème se repose pour les adresses postales, les adresse mails, les compte de réseau sociaux etc...

Autre exemple (pour un sous ensemble unique)
On code une voiture, l'objet conducteur existe déjà, il sait qu'il doit démarrer, enclencher une vitesse, et ensuite combiner accélération et action sur le volant.
La voiture doit donc disposer de toutes ces "actionneurs".
Voyons démarrer, cela implique, la batterie et le moteur. Mais est-ce à l'objet Voiture de savoir qu'il va falloir pomper du carburant, l'injecter, déclencher une étincelle, qui provoquera une explosion qui mettra en mouvement le piston, qui lui-même mettra en rotation le vilebrequin. Ou la voiture doit-elle se contenter de mettre du courant au moteur et lui se gère de son coté?
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
C'est les SubFixtures qui créent le fixture donc il peut y en avoir un ou plusieurs(nombre variable) donc ils leurs faut une classe dédiée.

On crée une classe pour le ou les subfixtures
mais après :
 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() 

Il faut faire quoi?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
On commence par 2 nouvelles classes

	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

La classe Point3D possède une méthode Shared qui construit une instance à partir de l'élément XML qui va bien.
Cette méthode doit convertir 3 doubles, écrits avec des points et mon pc est en virgule, alors elle appelle une autre méthode qui gère le problème, cette seconde méthode est Shared pour être utilisable depuis l'autre.


On modifie un peu la requête d'import
			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()


On peut même s'amuser à compter combien de fixtures ont plusieurs subfixtures, ou combien n'en n'ont pas
			Dim n1 As Integer = mesFixtures.Count(Function(f) f.LesSubFixtures.Count > 1)
			Dim n0 As Integer = mesFixtures.Count(Function(f) f.LesSubFixtures.Count = 0)

ou alors lister tous les fixtures dont au moins un subfixture n'a pas d'adresse de patch
Dim pbImport As List(Of Fixture) = mesFixtures.Where(Function(f) f.LesSubFixtures.Any(Function(s) s.PatchAdresse = -1)).ToList()

Dans ce fichier, les 3 requêtes donnent 0.

Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
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
Génial merci beaucoup, j'ai tout ce qu'il me faut
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
De rien
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
j'aurais encore besoin de ton aide, si tu es d'accord.
J'ai essayé de mettre en application ton avant-dernier post mais j'ai des soucis.
Je travaille maintenant avec un autre fichier xml plus compliqué(avec environ 17000 lignes) que voici :
https://drive.google.com/file/d/1EUJgjJZv8tvtvvTC9SEyIeqg8IQHZBxZ/view?usp=sharing
Il faut le modifier pour que Linq puisse l'interpréter:
Il faut :
- remplacer la ligne 2 par "<MA>"
- supprimer toutes les lignes qui contiennent "<Preset xsi:nil="True" />"

Jusque là ça va!

Ensuite j'ai crée des class pour accueillir les données comme ceci :
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


J'ai commencé à écrire la ligne pour récupérer les infos mais ça ne fonctionne pas.


Je n'ai pas fini de taper la ligne mais peux tu me dire ce qui ne va pas.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Rapidement, sans avoir testé.
New Trucmuche With
{'avec une accolade


Autre chose Handle existe déjà en .Net, il serait judicieux d'appeler la classe autrement ou à défaut de la mettre dans un manespace.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
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
J'ai fait des corrections :
j'ai renommer Handle par Embeded
et changer la ligne :

Mais Il y a encore des erreurs
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Peux tu poster le code?
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
oui bien sur
            MesPresets = (
            From f In xDoc.Descendants("Preset")
            Select New Presets With
             {
                .Name = f.Attribute("name")?.Value,
                .SpecialUse = f.Attribute("SpecialUse")?.Value,
                .Channels = (From s In f.Descendants("channels")
                             Select New Channels With
                    {
                                 .PresetValue = (From t In s.Descendants("PresetValue")
                                                 Select New Channel With
              {
                                                     .Fixture_id = t.Element("channel").Attribute("Fixture_Id")?.Value,
                                                     .Attribute_Name = t.Element("Channel").Attribute("Attribute_Name")?.Value
             ))}).ToList()}).ToList()}).Tolist()
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Dans tes classes, tu as défini des tableaux, et dans la requêtes, tu charges des listes.
Soit tu mets des listes dans tes classes, soit tu castes en tableau, avec ToArray()
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
Je me suis inspiré de ce que tu m'as envoyé hier. Apparemment je l'ai mal réutilisé.
Il vaut mieux passer par des listes ou des tableaux ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Toutes les collections (y'en a un paquet en .Net) dérivées des listes chainées ont ce gros avantage par rapport à un tableau de pouvoir ajouter un item (à la fin), de pouvoir insérer un item (à un index précis) ou de pouvoir enlever un item "sans laisser de trou" et tout ça sans variable tampon et dans un délai d'exécution extrêmement rapide (quelques "ticks"). Par extension, les algorithmes de tris sont aussi beaucoup plus rapides.

Tu vas me dire y'a ReDim, oui, mais redim est long et couteux en ressources système, d'ailleurs il n'existe par en C#, c'est une des "tolérance" de VB.Net, importée de VB6 et VBA.

Par défaut, j'utilise toujours une liste chainée, sauf quand je dois passer mes datas en paramètre à une méthode qui ne prends qu'un tableau en entrée. Mais dans ce cas, la plupart du temps, je fais un ToArray() au moment opportun.

Après je suis autodidacte, mon apprentissage est incomplet et empirique, du coup ça vaut ce que ça vaut.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
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
Ok,
du coup dans mes classes, pour déclarer des listes il faut que je supprime les parenthèses ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Haaaa, ta remarque me fais prendre conscience de ma boulette
J'ai codé en C# (que je maitrise mieux) et utilisé un traducteur et j'ai pas fait attention aux parenthèses....
Ce qui est même surprenant c'est que les codes que je t'ai donnés ont fonctionné.

Bref, message 11, puis 19, la classe Fixture mieux écrite
Class Fixture
    Public Property Nom As String'là c'est bien une string unique

    Public Property Type As String

    Public Property NomType As String

    Public Property LesSubFixtures As List(Of SubFixture)'là c'est une liste 
End Class


Et les deux autres
Class SubFixture
    Public Property PatchAdresse As Integer

    Public Property Position As Point3D

    Public Property Rotation As Point3D

    Public Property Echelle As Point3D
End Class

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

Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Et 2eme boulette, c'était pas des tableaux du coup, puisqu'un tableau se déclare ainsi
Public Property test As String()
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
Bon j'ai crée toutes mes class comme ceci :
Class Presets
    Public Property Name As Integer
    Public Property SpecialUse As String
    Public Property Channels As List(Of Channels)
End Class

Class Channels
    Public Property PresetValue As List(Of PresetValue)
End Class

Class PresetValue
    Public Property Value As Double
    Public Property Embeded As List(Of Embeded) ' quand il y a le noeud HANDLE c'est qu'il y a une preset embeded
    Public Property Channel As List(Of Channel)
End Class

Class Embeded
    Public Property Name As Integer
    Public Property Numero As List(Of Numero)
End Class

Class Channel
    Public Property Fixture_id As Integer
    Public Property Attribute_Name As String
End Class

Class Numero
    Public Property Num1 As Integer
    Public Property Num2 As Integer
    Public Property Num3 As Integer
End Class


j'ai mis ces lignes pour déssirialiser une partie des données pour voir si ça marche:
 MesPresets = (
            From f In xDoc.Descendants("Preset")
            Select New Presets With
             {
                .Name = f.Attribute("name")?.Value,
                .SpecialUse = f.Attribute("SpecialUse")?.Value,
                .Channels = (From s In f.Descendants("channels")
                             Select New Channels With
                    {
                                 .PresetValue = (From t In s.Descendants("PresetValue")
                                                 Select New Channel With
              {
                                                     .Fixture_id = t.Element("channel").Attribute("Fixture_Id")?.Value,
                                                     .Attribute_Name = t.Element("Channel").Attribute("Attribute_Name")?.Value
             ))}).ToList()}).ToList()}).Tolist()

Mais Visual studio me dit qu'il manque des parenthèses fermantes mais je ne vois pas où. As tu une idée?

J'ai une autre question : est ce que ça ne pose pas de problème qu'une Property d'une class ai le même nom qu'une classe?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Bonsoir
pour plus de lisibilité et d'efficacité de codage / déboggage, je te conseille d'aérer et de bien indenter ton code
        Dim MesPresets As List(Of Presets) =
            ('la parenthèse fermante associée est au même niveau
            From f In xDoc.Descendants("Preset")
            Select New Presets With
                 {'idem pour cette accolade
                    .Name = f.Attribute("name")?.Value,
                    .SpecialUse = f.Attribute("SpecialUse")?.Value,
                    .Channels = (From s In f.Descendants("channels")
                                 Select New Channels With
                                     {
                                         .PresetValue = (From t In s.Descendants("PresetValue")
                                                         Select New Channel With
                                                             {
                                                                 .Fixture_id = t.Element("channel").Attribute("Fixture_Id")?.Value,
                                                                 .Attribute_Name = t.Element("Channel").Attribute("Attribute_Name")?.Value
                                                             }
                                                         ).ToList()
                                     }
                                 ).Tolist()
                 }
            ).ToList()

Cela permet de bien visualiser où chaque block commence et finit.

Mais c'est pas tout.

Dans Preset, Name est un integer, or tu veux lui assigner une string.
Dans Chanels, PresetValue est une liste de PresetValue, or tu veux lui affecter une liste de Channel.

Comme je ne sais ce qui est bon (les classes ou la requête), je te laisse corriger.

J'ai une autre question : est ce que ça ne pose pas de problème qu'une Property d'une class ai le même nom qu'une classe?

Non.

Par contre, toujours dans l'idée de s'y retrouver facilement, n'appelle pas une collection de "Bidule", "Bidule", appelle la "LesBidules", ou encore "Bidules", bref au moins un pluriel qui montre qu'il y a plusieurs "Bidule"

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 (j'avais oublié la politesse),
J'ai suivi tes conseils et modifié les noms des class. J'ai aussi modifié et ajouté des class pour mieux correspondre à mes besoins. Les voici :
Class PresetPools
    Public Property Presets As Les_Presets
    Public Property Index As Integer
End Class

Class Les_Presets
    Public Property Index As Integer
    Public Property Name As String
    Public Property SpecialUse As String
    Public Property Channels As List(Of Les_Channels)
End Class

Class Les_Channels
    Public Property PresetValue As List(Of Les_PresetValue)
End Class

Class Les_PresetValue
    Public Property Value As Double
    Public Property Embeded As List(Of Les_Embeded) ' quand il y a le noeud HANDLE c'est qu'il y a une preset embeded
    Public Property Channel As List(Of Les_Channel)
End Class

Class Les_Embeded
    Public Property Name As String
    Public Property Numero As List(Of Les_Numero)
End Class

Class Les_Channel
    Public Property Fixture_id As Integer
    Public Property Attribute_Name As String
End Class

Class Les_Numero
    Public Property Num1 As Integer
    Public Property Num2 As Integer
    Public Property Num3 As Integer
End Class

J'ai donc corrigé le code en conséquence mais j'ai deux soucis que je n'arrive pas à régler.
Voici le code:

            Dim MesPresetPool2 As List(Of PresetPools) =
            ('la parenthèse fermante associée est au même niveau
            From k In xDoc.Descendants("PresetPools")
            Select New PresetPools With
                {
                .Index = k.Attribute("index")?.Value,
                .Presets = (From l In k.Descendants("PresetPool")
                            Select New Les_Presets With
                                    {
                                    .Index = l.Attribute("index")?.Value,
                                    .Name = l.Attribute("name")?.Value,
                                    .SpecialUse = l.Attribute("SpecialUse")?.Value,
                                    .Channels = (From m In l.Descendants("Channels")
                                                 Select New Les_Channels With
                                                         {
                                                         .PresetValue = (From n In m.Descendants("PresetValue")
                                                                         Select New Les_PresetValue With
                                                                                 {
                                                                                 .Value = n.Attribute("Value")?.Value,
                                                                                 .Embeded = (From p In n.Descendants("Handle")
                                                                                             Select New Les_Embeded With
                                                                                                     {
                                                                                                     .Name = p.Attribute("name")?.Value,
                                                                                                     .Numero = (From q In p.Descendants("No")
                                                                                                                Select New Les_Numero With
                                                                                                                        {
                                                                                                                        .Num1 = q.Element("No")?.Value' A MODIFIER POUR LES NUM DES PRESETS EMBEDED
                                                                                                                        }
                                                                                                                ).ToList(),
                                                                                                      }
                                                                                            ).tolist(),
                                                                                 .Channel = (From t In n.Descendants("Channel")
                                                                                             Select New Les_Channel With
                                                                                                         {
                                                                                                            .Fixture_id = t.Element("channel").Attribute("Fixture_Id")?.Value,
                                                                                                            .Attribute_Name = t.Element("Channel").Attribute("Attribute_Name")?.Value
                                                                                                         }
                                                                                             ).ToList()
                                                                                  }
                                                                         ).tolist()
                                                          }
                                                 ).tolist()
                                    }
                            ).tolist()
                }
            ).tolist()

Avec ces erreurs:

On verra aprés mais il y aura la particularité du noeud Handle avec plusieurs éléments avec le même nom.
je me disais qu'on pourrait continuer à communiquer par mail, mais on aurait plus les balises de code. Quand penses tu?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
J'ai suivi tes conseils et modifié les noms des class

Public Property Channel As List(Of Les_Channel)

J'ai du mal m'exprimer, je te conseillais plutôt l'inverse
Public Property LesChannels As List(Of Channel) 'LesChanels est une liste qui contiendra des instances de Channel



Ensuite je te conseille d'activer OptionStrict, à aucun moment tu prends la peine de convertir les texte en nombre (double ou integer), du coup tu laisses VB faire ce qu'il veut. Et parfois, c'est pas ce que tu veux toi.

L'erreur "Expression attendue", vient du fait qu'à la ligne au-dessus, il y a une virgule. Cette virgule veut dire que tu vas initialiser une autre propriété.

Voici un exemple pour une Personne, qui a un Nom, un Prenom et une DateDeNaissance
Dim p as New Personne with
{
    .Nom = "Sors", 'je vais encore initier le prénom est la date, il y a une virgule
    .Prenom = "Jean",
    .DateNaissance = "01/01/2000" ' pas d'autre propriété à initier -> pas de virgule

}


Une fois cette erreur corrigée, il y a un autre problème, la propriété Presets de la classe PresetPools n'est pas une liste, et dans la requête, tu veux y mettre une liste
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
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
C'est corrigé (merci). Malheureusement j'ai une exception à l’exécution :
sur :
Select New Channel With
{
 .Fixture_id = CInt(t.Element("channel").Attribute("fixture_Id")?.Value),
 .Attribute_Name = t.Element("Channel").Attribute("attribute_Name")?.Value
}


avec cette erreur:
System.NullReferenceException : 'La référence d'objet n'est pas définie à une instance d'un objet.'

System.Xml.Linq.XContainer.Element(...) retournée Nothing.

J'ai vérifié il y a bien des données pour ces éléments et j'ai mis les ? avant ".value". En revanche il n'y a pas à chaque fois le nœud Handle.
Comment puis-je lui dire si le nœud existe alors tu le prends sinon tu passes à la suite?
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Tu as mis
Element("channel")
une fois avec « c » et une fois avec « C »
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
En faisant comme ça, tu n'es pas robuste à l'absence d'un "étage", là clairement ça plante car dans t, il n'y a pas d'élément qui s'appelle "channel" (ou "Channel," un des 2).
Pour pallier ce problème, il faut mettre un ? à chaque "étage", comme je te l'ai montré au message 19 par exemple https://codes-sources.commentcamarche.net/forum/affich-10095511-acces-aux-valeurs-dans-un-xml?full#19

Dans ce cas, s'il manque quelque chose la "ligne" retourne Nothing, cependant c'est la conversion en Integer qui va planter.

C'est pourquoi, toujours au message 19, j'avais ajouté une méthode qui se chargeait de la conversion de façon robuste (accepte, le point ou la virgule et retourne un nombre par défaut si la chaine n'est pas convertible).

Cependant, telle que je te l'ai montrée, elle n'est utilisable que dans la classe ou elle a été écrite.
Il faut en faire une extension de classe.

Je n'ai pas le temps ce matin.

Tu peux chercher sur le net ce qu'est une extension, si tu ne t'en es pas sorti je te ferais un exemple ce soir
Commenter la réponse de wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
Bonjour,
C'est très sympa de m'aider : je n'y serai pas arrivé seul.

J'ai réussi à créer l'extension de class pour convertir en double.
J'ai aussi corrigé la requête pour Les_Channels : j'avais mis un .element de trop alors qu'il fallait accéder aux attributs.
En revanche, je me suis aperçu que dans mon xml pour le nœud "PresetValue" il y a soit l'attribut "value" soit l'élément "Handle", avec à chaque fois l'élément "Channel". Du coup ça lève une exception quand je lance la dessérialisation dans l'extension de class.
J'ai bien mis les points d'interrogations quand je récupère des valeurs d'attribut mais peut on les mettre aussi pour qu'il teste la présence de l'élément ?
Sinon est il possible d'inclure des conditions ?
Et sinon comment puis-je faire ?
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
PEux tu poster le code de l’extension.
Je ne suis pas encore rentré, mais j’y regarderai ce soir
Commenter la réponse de wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
Le voici avec mes modifs :
Module Module_extensions

    <Extension()>
    Function Mon_todouble(ByVal texte As String) As Double
        Dim res As Double

        If texte <> Nothing Then
            If Double.TryParse(texte.Replace(",", "."), System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, res) Then
                Return res
            Else
                Return Double.NaN
            End If
        End If
    End Function

End Module

J'ai enlevé 2 c qui étaient respectivement après "." et après "," dans le "texte.replace".
et j'ai rajouté une condition (pour que ça marche) mais je ne pense pas que ce soit la meilleur façon de faire.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Si c’est bien, je n’avais pas vérifié si le tryparse accepte nothing en entrée, à priori non.

Par contre en l’état, si c’est nothing tu ne retourne rien.

Tu peux faire.

        If texte <> Nothing Then
            If Double.TryParse(texte.Replace(",", "."), System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, res) Then
                Return res
            End If
        End If
        Return Double.NaN


Ou encore
        If texte <> Nothing AndAlso Double.TryParse(texte.Replace(",", "."), System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, res) Then
                Return res
        End If
        Return Double.NaN


J’ai tapé de tête.


Aussi, j’avais mis double.NaN comme retour en cas d’absence de texte, mais ça peut (certainement) mettre la garouille dans de futurs calculs, il faudrait dont vérifier.

Tu peux maintenant faire une autre extension pour les Integer.
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,
J'ai fait pas mal de changements dans les class et aussi dans la requête pour récupérer les valeurs. Il y a juste une chose qui ne fonctionne pas comme je voudrais.
Dans le fichier xml, il peut y avoir ce genre de chose :
<Preset index="1" name="ch4 HOME">
				<Values>
					<Channels>
						<PresetValue>
							<Handle name="warp niches 0.1">
								<No>1</No>
								<No>0</No>
								<No>1</No>
							</Handle>
							<Channel fixture_id="4" channel_id="4" attribute_name="FIXTUREGLOBALRESET" />
						</PresetValue>
						<PresetValue>
							<Handle name="warp niches 0.1">
								<No>1</No>
								<No>0</No>
								<No>1</No>
							</Handle>
							<Channel fixture_id="4" channel_id="4" attribute_name="PAN" />
						</PresetValue>
					</Channels>
				</Value>
			<Preset>

Je récupère déjà le <Handle>.name mais je voudrais avoir les 3 numéros concaténés dans la même variable. Je ne trouve pas comment faire ?
As tu une idée ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Tu peux utiliser une variable intermédiaire, avec le mot clé Let
        Dim texte = "<Preset index=""1"" name=""ch4 HOME"">
	<Values>
		<Channels>
			<PresetValue>
				<Handle name=""warp niches 0.1"">
					<No>1</No>
					<No>0</No>
					<No>1</No>
				</Handle>
				<Channel fixture_id=""4"" channel_id=""4"" attribute_name=""FIXTUREGLOBALRESET"" />
			</PresetValue>
			<PresetValue>
				<Handle name=""warp niches 0.1"">
					<No>3</No>
					<No>2</No>
					<No>1</No>
				</Handle>
				<Channel fixture_id=""4"" channel_id=""4"" attribute_name=""PAN"" />
			</PresetValue>
		</Channels>
	</Values>
</Preset>"

        Dim lesPresetsJoints As List(Of String) = (From h In XDocument.Parse(texte).Descendants("Handle")
                                                   Let lesPresets =
                                                       (
                                                        From p In h.Descendants("No")
                                                        Select p.Value
                                                       )
                                                   Select String.Join(";", lesPresets)
                                                   ).ToList()



Ou faire ta requête directement dans le String.Join
        Dim lesPresetsJoints As List(Of String) = (From h In XDocument.Parse(texte).Descendants("Handle")
                                                   Select String.Join(";",
                                                        From p In h.Descendants("No")
                                                        Select p.Value
                                                                      )
                                                   ).ToList()


Le résultat est le même

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
En fait les données qui se trouvent dans Handle sont liés à la PresetValue donc je voudrais mettre les "No" dans chaque PresetValue correspondante.
j'ai mis ce code mais il me dit :
System.InvalidCastException : 'Impossible d'effectuer un cast d'un objet de type 'WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String]' en type 'System.String'.'


Voici le code :
            MesPresetPool =
            (
            From k In xDoc.Descendants("PresetPool")
            Select New PresetPool With
                {
                .Index = Mon_ToInteger(k.Attribute("index")?.Value),
                .Les_Presets = (From l In xDoc.Descendants("Preset")
                                Select New Presets With
                                    {
                                    .Index = Mon_ToInteger(l.Attribute("index")?.Value),
                                    .Name = l.Attribute("name")?.Value,
                                    .SpecialUse = l.Attribute("SpecialUse")?.Value,
                                    .Les_values = (From m In l.Descendants("Values")
                                                   Select New Values With
                                                            {
                                                         .Les_Channels = (From v In m.Descendants("Channels")
                                                                          Select New Channels With
                                                                                {
                                                                         .Les_PresetValue = (From n In v.Descendants("PresetValue")
                                                                                             Select New PresetValue With
                                                                                                 {
                                                                                                 .Value = Mon_todouble(n.Attribute("Value")?.Value),
                                                                                                 .Embeded_Name = n?.Element("Handle")?.Attribute("name")?.Value,
                                                                                                 .Embeded_Num = (From p In n?.Descendants("Handle")
                                                                                                                 Select String.Join(";",
                                                                                                                            From u In p.Descendants("No")
                                                                                                                            Select p?.Value
                                                                                                                                    )
                                                                                                                 ),
                                                                                                 .Fixture = Mon_ToInteger(n.Element("Channel")?.Attribute("fixture_id")?.Value),
                                                                                                 .Attribute_name = n.Element("Channel")?.Attribute("attribute_name")?.Value
                                                                                                  }
                                                                                             ).ToList()
                                                                                }
                                                                        ).ToList()
                                                            }
                                                    ).ToList()
                                    }
                            ).ToList()
                }
            ).ToList()


voir de la ligne 24 a 29
P.S. J'ai modifié la propriété Embeded_Num de la class PresetValue en la déclarant comme une string.
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -

 .Embeded_Num = (From p In n?.Descendants("Handle")
              Select String.Join(";",
                       From u In p.Descendants("No")
                        Select p?.Value
                              )

qui dit from dit collection et donc c'est pas compatible d'une string.
Et en plus, tu sectionnes p.Value et pas u.Value.

Si tu es sûr et certain qu'il ne peut y avoir qu'un seul "Handle" ceci devrait fonctionner
 .Embeded_Num = (String.Join(";",
                       From u In n?.Descendants("No")
                        Select u?.Value
                              )
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Aussi, tu as fait de Mon_ToInteger une extension.
L'interêt d'une extension est d'ajouter une méthode à un type.

L'idée étant de s'en servir comme ceci
.Index = l.Attribute("index")?.Value.Mon_ToInteger(),
Commenter la réponse de wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
C'est bon ! Oui il ne peut y avoir qu'un seul Handle.

Je ne sais pas si tu as remarqué mais ces No correspondent aux PresetPools ; PresetPool ; Preset.
C'est à dire que dans notre exemple :
la preset avec l'index 5 a les valeurs de la preset 1dans le PresetPool 4.
donc la valeur 32.499603 pour l'attribute_name "COLORRGB1" du fixture_id 10

dit rapidement:
(Dans une preset j'ai un lien vers une autre preset mais je voudrais la valeur au lieu du lien)

Je sais pas si c'est très clair mais comment puis je aller chercher ces valeurs pour les mettre dans MesPresetPool

N'hésite pas à me demander des précisions.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Quand tu dis
dans notre exemple :
C’est dans le fichier complet?
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Oui c'est sur le fichier complet.
Est ce su'on peut le faire dans la requête ou est ce qu'il faut le faire après ?
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Tu n'as pas d'idée ?
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Je n’ai pas eu le temps d’essayer, mais à priori je pense qu’il faut le faire en 2 passes
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Ok pas de souci.
Est ce qu'il est possible de faire une requête du style select "preset" where "handle" existe sur un xml pour avoir toutes les presets qui on un élément "handle"?
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Oui
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Je n'ai pas compris ton exemple,

la preset avec l'index 5 a les valeurs de la preset 1dans le PresetPool 4.
donc la valeur 32.499603 pour l'attribute_name "COLORRGB1" du fixture_id 10


Dans le fichier complet, des preset avec l'index 5, y'en a plein, je sais pas de laquelle tu parles.
La preset 1 dans le PresetPool 4 contient effectivement (entre autre) COLORRGB1, mais pas 32.499603 ni fixture_id


Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
pour ta seconde question, Linq n'aime pas non plus les xsi:null....

        Dim lignes As List(Of String) = File.ReadAllLines("---- presets ----.xml").ToList() 'on met toutes les lignes du fichier dans une liste
        lignes(1) = "<MA>"

        Dim texteCorrige As String = String.Join(Environment.NewLine, lignes) 'on refait un texte complet
        texteCorrige = texteCorrige.Replace("xsi:nil=""true""", "")'on supprime toutes les occurrences de "xsi:nil="true"

        Dim xDoc As XDocument = XDocument.Parse(texteCorrige) 'on parse le texte corrigé

        Dim presetsWidthHandle As List(Of Les_Presets) =
            (
                From p In xDoc.Descendants("Preset")
                Where p.Element("Values")?.Element("ChannelTypes")?.Elements("PresetValue")?.Any(Function(x) x IsNot Nothing)
                Select New Les_Presets With
                    {
                        .Name = p.Attribute("name")?.Value
                    }
            ).ToList()


Il y en a 163, dans ton fichier
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
PS, j'ai pris la classe Les_Presets, telle qu'elle est écrite dans le post 36
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
J'ai du m’emmêler les pinceaux, j'en suis désolé, car effectivement ça ne correspond pas.
Je te réexplique :
Dans le fichier xml , il y a 10 catégories de "preset" ("presetpool" de 0 a 9). Dans chaque preset il y a des "attribute_name" avec pour chacun une valeur.
MAIS une "preset" peut faire référence aux valeurs d'une autre "preset", elle peut aussi avoir des valeurs pour des "attribute-name" et faire référence à une autre "preset" pour d'autre "attribute-name"
Par exemple :
Dans la preset 12 du "PresetPool" 0, il y a une référence à la "preset" 11 (oui oui 11 c'est à dire 12-1) du "PresetPool" 0 pour l'attribute_name SHUTTER du fixture 10:
PRESET 0.12
<Preset index="12" name="313" SpecialUse="Normal">
 <Values>
  <Channels>
   <PresetValue>
    <Handle name="301 0.12">
     <No>1</No>
     <No>0</No>
     <No>12</No>
    </Handle>
    <Channel fixture_id="3" channel_id="3" attribute_name="SHUTTER" />
   </PresetValue>
.
.
.

PRESET 0.11
<PresetValue Value="41.601875">
 <Channel fixture_id="3" channel_id="3" attribute_name="SHUTTER" />


En résumé, je voudrais supprimer le noeud Handle(la référence à l'autre preset) pour mettre à la place les valeur de la preset référencée en fonction du fixture_id et de "attribute_name" :
comme ceci
<Preset index="12" name="313" SpecialUse="Normal">
 <Values>
       <Channels>
            <PresetValue Value="41.601875">
                   <Channel fixture_id="3" channel_id="3" attribute_name="SHUTTER" />
           </PresetValue>
...


Pas dans le xml, là c'est pour t'expliquer, il faudrait le faire dans la liste de listes. Est ce que tu comprends ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
12 - 1,
parce que
  • de 1 à N, au lieu de 0 à N -1 comme les index?
  • 1 c'est le premier No qui est soustrait à 12 le dernier No?
  • autre raison?


"PresetPool" 0
parce que
  • on ne change pas de presetpool?
  • le 2 eme No c'est 0?
  • autre raison?


l'attribute_name SHUTTER du fixture 10
je ne voie pas d'où sort le 10.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
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
12-1
Oui c'est de 1 à N, au lieu de 0 à N -1 comme les index

PresetPool
C'est indiqué par le 2ème No et ça peut être dans un autre PresetPool

l'attribute_name SHUTTER du fixture 10
Je ne sais pas où j'ai vu ça mais c'est le fixture_id 3
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ok, et le premier No, il sert à quoi?
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Je pense que c'est le numéro du "Presetpools" +1 mais il peut y en avoir q'un, du coup il ne sert pas.
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Ok
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Bonsoir,

j'ai un problème avec cette preset, ligne 11724 du fichier
			<Preset index="227" name="201 francois" preset_mode="Global" SpecialUse="Normal">
				<Values>
					<ChannelTypes>
						<PresetValue Value="69.5">
							<ChannelType fixture_type="Alpha Profile 800ST Standard Lamp on" module="1" attribute="COLORRGB1" />
						</PresetValue>
						<PresetValue Value="88.25">
							<ChannelType fixture_type="Alpha Profile 800ST Standard Lamp on" module="1" attribute="COLORRGB2" />
						</PresetValue>
						<PresetValue Value="93">
							<ChannelType fixture_type="Alpha Profile 800ST Standard Lamp on" module="1" attribute="COLORRGB3" />
						</PresetValue>
						<PresetValue Value="0">
							<ChannelType fixture_type="Alpha Profile 800ST Standard Lamp on" module="1" attribute="COLOR1" />
						</PresetValue>
						<PresetValue Value="0">
							<ChannelType fixture_type="Alpha Profile 800ST Standard Lamp on" module="1" attribute="COLORMIXER" />
						</PresetValue>
						<PresetValue>
							<Handle name="L201 4.246">
								<No>1</No>
								<No>4</No>
								<No>246</No>
							</Handle>
							<ChannelType fixture_type="933+cc10couleurs 00" module="1" attribute="SCROLLER" />
						</PresetValue>
					</ChannelTypes>
				</Values>
			</Preset>


Je n'ai pas de fixture_id, ni de attribute_name, or tu m'as dit
En résumé, je voudrais supprimer le noeud Handle(la référence à l'autre preset) pour mettre à la place les valeur de la preset référencée en fonction du fixture_id et de "attribute_name" :


Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Ces codes

les extensions

Imports System.Globalization
Imports System.Runtime.CompilerServices

Module Extension
        <Extension()>
        Function ToInt(ByVal Texte As String) As Integer
            Dim res As Integer = -1
            Integer.TryParse(Texte, res)
            Return res
        End Function

        <Extension()>
        Function ToInt(ByVal Attribut As XAttribute) As Integer
            If Attribut Is Nothing Then Return -1
            Return Attribut.Value.ToInt()
        End Function

        <Extension()>
        Function ToInt(ByVal Element As XElement) As Integer
            If Element Is Nothing Then Return -1
            Return Element.Value.ToInt()
        End Function

        <Extension()>
        Function ToDouble(ByVal Texte As String) As Double
            Dim res As Double = Double.NaN
            Double.TryParse(Texte.Replace(","c, "."c), NumberStyles.Number, CultureInfo.InvariantCulture, res)
            Return res
        End Function

        <Extension()>
        Function ToDouble(ByVal Attribut As XAttribute) As Double
            If Attribut Is Nothing Then Return Double.NaN
            Return Attribut.Value.ToDouble()
        End Function

        <Extension()>
        Function ToDouble(ByVal Element As XElement) As Double
            If Element Is Nothing Then Return Double.NaN
            Return Element.Value.ToDouble()
        End Function
    End Module


les classes
Class PresetValue
    Public Property FixtureId As Integer
    Public Property ChannelId As Integer
    Public Property AttributeName As String
    Public Property Value As Double
End Class

Class Preset
    Public Property ID As Integer
    Public Property Name As String
    Public Property PresetValues As List(Of PresetValue)
End Class

Class PresetPool
    Public Property ID As Integer
    Public Property Presets As List(Of Preset)
End Class


et l'import de fichier
        Dim lignes As List(Of String) = File.ReadAllLines("---- presets ----.xml").ToList()
        lignes(1) = "<MA>"
        Dim texteCorrige As String = String.Join(Environment.NewLine, lignes)
        texteCorrige = texteCorrige.Replace("xsi:nil=""true""", "")
        Dim xdoc As XDocument = XDocument.Parse(texteCorrige)
        Dim passe1 = (From pp In xdoc.Descendants("PresetPool") Select New With {
        .Index = pp.Attribute("index").ToInt(),
        .Presets = (From p In pp.Descendants("Preset") Select New With {
            .Index = p.Attribute("index").ToInt(),
            .Name = p.Attribute("name")?.Value,
            .PresetValues = (From pv In p.Descendants("PresetValue") Let c = pv.Element("Channel") Let h = pv.Element("Handle") Select New With {
                .Value = pv.Attribute("Value").ToDouble(),
                .Channel = If(c IsNot Nothing, New With {
                    .FixtureId = c.Attribute("fixture_id").ToInt(),
                    .ChanelId = c.Attribute("channel_id").ToInt(),
                    .AttributeName = c.Attribute("attribute_name").Value
                }, Nothing),
                .Handle = If(h IsNot Nothing, New With {
                    .name = h.Attribute("name")?.Value,
                    .PresetPoolId = h.Elements("No").ElementAt(1).ToInt(),
                    .PresetId = h.Elements("No").ElementAt(2).ToInt() - 1
                }, Nothing)
            }).ToList()
        }).ToList()
    }).ToList()
        Dim presetPools As List(Of PresetPool) = New List(Of PresetPool)()

        For Each pp In passe1
            Dim psp As PresetPool = New PresetPool With {
            .ID = pp.Index,
            .Presets = New List(Of Preset)()
        }
            presetPools.Add(psp)

            For Each p In pp.Presets
                Dim ps As Preset = New Preset With {
                .ID = p.Index,
                .Name = p.Name,
                .PresetValues = New List(Of PresetValue)()
            }
                psp.Presets.Add(ps)

                For Each pv In p.PresetValues
                    Dim psv As PresetValue = New PresetValue With {
                    .Value = pv.Value
                }

                    If pv.Channel IsNot Nothing Then
                        psv.AttributeName = pv.Channel.AttributeName
                        psv.ChannelId = pv.Channel.ChanelId
                        psv.FixtureId = pv.Channel.FixtureId
                    End If

                    If pv.Handle IsNot Nothing Then
                        Dim reference = passe1.SingleOrDefault(Function(x) x.Index = pv.Handle.PresetPoolId)?.Presets.SingleOrDefault(Function(y) y.Index = pv.Handle.PresetId)?.PresetValues.SingleOrDefault(Function(z) z.Channel IsNot Nothing AndAlso z.Channel.AttributeName = pv.Channel.AttributeName AndAlso z.Channel.FixtureId = pv.Channel.FixtureId)
                        If reference IsNot Nothing Then psv.Value = reference.Value
                    End If

                    ps.PresetValues.Add(psv)
                Next
            Next
        Next


ont l'air de fonctionner jusqu'à la preset en question
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,
Ah oui, c'est une particularité :
-- si dans le nœud <PresetValue> il n'y a pas le nœud <Channel> et qu'il y a le nœud <ChannelType> alors :
Ça veut dire que l'"attribute" peut s'appliquer à tous les fixtures du "fixture_type" ( element("ChannelType").attribut("fixture_type") ) pour l'attribute_name.
On trouve cette info dans le premier xml qu'on a "déserialisé". C'est element("FixtureType").attribute("name") sans le nombre du début

-- si dans le nœud <PresetValue> il n'y a ni <Channel> ni <ChannelType> alors :
Ça veut dire que l'"attribute" peut s'appliquer à tous les fixtures. Pas besoin de récupérer les Fixture_Id.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Et avec ce que je t'ai donné tu vas t'en sortir?

Là je m'en vais quelques jours.
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Je ne sais pas mais je vais essayer.
Je parts aussi quelques jours pour pâques.
Bonnes vacances.
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,
J'ai un peu avancé dans le code mais je bloque à nouveau.
Quand il y a le noeud <Handle> et le noeud <ChannelType> par exemple comme ceci :
<PresetValue>
	<Handle name="L201 4.246">
		<No>1</No>
		<No>4</No>
		<No>246</No>
	</Handle>
	<ChannelType fixture_type="933+cc10couleurs 00" module="1" attribute="SCROLLER" />
</PresetValue>

Je voudrais prendre le ou les "PresetValue", quand le "attribute_name" correspond au "attribut", qui sont en référence pour les mettre dans la liste Presetpools. Pour l'exemple ci dessus il faut prendre :
<Preset index="245" name="L201" SpecialUse="Normal">
	<Appearance Color="0000ff" />
		<Values>
			<Channels>
				<PresetValue Value="46.696079">
					<Channel fixture_id="201" channel_id="201" attribute_name="SCROLLER" />
				</PresetValue>
				<PresetValue Value="46.696079">
					<Channel fixture_id="301" channel_id="301" attribute_name="SCROLLER" />
				</PresetValue>
				<PresetValue Value="48.696079">
					<Channel fixture_id="17" channel_id="17" attribute_name="SCROLLER" />
				</PresetValue>
				<PresetValue Value="46.196079">
					<Channel fixture_id="20" channel_id="20" attribute_name="SCROLLER" />
				</PresetValue>
			</Channels> .........


Mais je n'y arrive pas. Comment dois-je faire?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Bonjour


passe1 est une collection temporaire qui charge le contenu tel qu'il est, ce afin de pouvoir chercher ensuite dedans les valeurs ou presetvaleurs pointées par les handle.
passe1 est construite à partir de types anonymes, c'est à dire sans classes formellement écrite, c'est spécifiquement prévu pour ce genre de cas:
  • utilisation unique
  • très limité


Pour construire la vraie collection, je fais des foreach car c'est plus lisible qu'une requête Linq, mais ça aurait marché aussi.

        Dim lignes As List(Of String) = File.ReadAllLines("---- presets ----.xml").ToList()
        lignes(1) = "<MA>"
        Dim texteCorrige As String = String.Join(Environment.NewLine, lignes)

        texteCorrige = texteCorrige.Replace("xsi:nil=""true""", "")

        Dim xdoc As XDocument = XDocument.Parse(texteCorrige)

        Dim passe1 = (
            From pp In xdoc.Descendants("PresetPool")
            Select New With {Key .Index = pp.Attribute("index").ToInt(), Key .Presets = (
                    From p In pp.Descendants("Preset")
                    Select New With
                        {
                            .Index = p.Attribute("index").ToInt(),
                            .Name = p.Attribute("name")?.Value,
                            .PresetValues =
                            (
                                From pv In p.Descendants("PresetValue")
                                Let c = pv.Element("Channel")
                                Let h = pv.Element("Handle")
                                Let ct = pv.Element("ChannelType")
                                Select New With
                                    {
                                    .Value = pv.Attribute("Value").ToDouble(),
                                    .Channel = If(c IsNot Nothing,
                                    New With
                                    {
                                        .FixtureId = c.Attribute("fixture_id").ToInt(),
                                        .ChanelId = c.Attribute("channel_id").ToInt(),
                                        .AttributeName = c.Attribute("attribute_name").Value
                                    }, Nothing),
                                    .Handle = If(h IsNot Nothing,
                                    New With
                                    {
                                        .name = h.Attribute("name")?.Value,
                                        .PresetPoolId = h.Elements("No").ElementAt(1).ToInt(),
                                        .PresetId = h.Elements("No").ElementAt(2).ToInt() - 1
                                    }, Nothing),
                                    .ChannelType = If(ct IsNot Nothing,
                                    New With
                                    {
                                        .FixtureType = ct.Attribute("fixture_type").Value,
                                        .Module = ct.Attribute("module").ToInt(),
                                        .Attribute = ct.Attribute("attribute").Value
                                    }, Nothing)
                                }).ToList()
                    }).ToList()
            }).ToList()


        Dim presetPools As New List(Of PresetPool)()
        For Each pp In passe1
            Dim psp As PresetPool = New PresetPool With {.ID = pp.Index, .Presets = New List(Of Preset)()}

            presetPools.Add(psp)

            For Each p In pp.Presets
                Dim ps As Preset = New Preset With {.ID = p.Index, .Name = p.Name, .PresetValues = New List(Of PresetValue)()}

                psp.Presets.Add(ps)

                For Each pv In p.PresetValues
                    Dim psv As PresetValue = New PresetValue With {.Value = pv.Value}

                    If pv.Channel IsNot Nothing Then
                        psv.AttributeName = pv.Channel.AttributeName
                        psv.ChannelId = pv.Channel.ChanelId
                        psv.FixtureId = pv.Channel.FixtureId
                    End If

                    If pv.Handle IsNot Nothing Then
                        Dim leprset = passe1.SingleOrDefault(Function(x) x.Index = pv.Handle.PresetPoolId)?.Presets.SingleOrDefault(Function(y) y.Index = pv.Handle.PresetId)

                        If pv.Channel IsNot Nothing Then
                            Dim reference = leprset?.PresetValues.SingleOrDefault(Function(z) z.Channel IsNot Nothing AndAlso z.Channel.AttributeName = pv.Channel.AttributeName AndAlso z.Channel.FixtureId = pv.Channel.FixtureId)
                            If reference IsNot Nothing Then
                                psv.Value = reference.Value
                            End If
                        ElseIf pv.ChannelType IsNot Nothing Then
                            Dim lesPresetValues = (
                                From x In leprset.PresetValues
                                Where x.Channel IsNot Nothing AndAlso x.Channel.AttributeName = pv.ChannelType.Attribute
                                Select New PresetValue With {.AttributeName = x.Channel.AttributeName, .ChannelId = x.Channel.ChanelId, .FixtureId = x.Channel.FixtureId, .Value = x.Value})
                            ps.PresetValues.AddRange(lesPresetValues)
                            Continue For 'on passe à l'itération suivante
                        Else
                            Throw New Exception("Cas non prévu")
                        End If
                    End If

                    ps.PresetValues.Add(psv)
                Next pv
            Next p
        Next pp



J'espère avoir compris tes demandes.
Il faut que tu vérifies que la sortie correspond bien à tous tes critères, bon courage le fichier est gros....
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
On y est presque !
J'ai essayé de recensé les cas possibles pour les presets :


<Preset index="12" name="313" SpecialUse="Normal">
 	<Values>
       	<Channels>
			<PresetValue Value="41.601875">
                <Channel fixture_id="3" channel_id="3" attribute_name="SHUTTER" />
			</PresetValue>
		</Channels>
 	</Values>
</Preset>

<!--
C'est une preset classique avec une valeur pour un attribut d'un channel
-------------------------------------------------------------------------------------------
-->


<Preset index="1" name="ch4 HOME">
	<Values>
		<Channels>
			<PresetValue>
				<Handle name="warp niches 0.1">
					<No>1</No>
					<No>0</No>
					<No>1</No>
				</Handle>
				<Channel fixture_id="4" channel_id="4" attribute_name="FIXTUREGLOBALRESET" />
			</PresetValue>
		</Channels>
	</Values>
</Preset>

<!--
C'est une preset classique avec un lien vers une autre preset
-------------------------------------------------------------------------------------------
-->

<Preset index="227" name="201 francois" preset_mode="Global" SpecialUse="Normal">
	<Values>
		<ChannelTypes>
			<PresetValue Value="69.5">
				<ChannelType fixture_type="Alpha Profile 800ST Standard Lamp on" module="1" attribute="COLORRGB1" />
					<PresetValue>
				</ChannelType>
			</PresetValue>
		</ChannelTypes>
	</Values>
</Preset>

<!--
C'est une preset où la valeur s'applique pour tout le FixtureType. Il peut donc y avoir plusieurs "ChannelTypes,
mais avec des "attribut" différents. ON A JUSTE BESOIN DE RÉCUPÉRER LES INFOS ET DE LES METTRE DANS LA LISTE

Un seul ChannelType à chaque PresetValue
-------------------------------------------------------------------------------------------
-->

<Preset index="228" name="202" preset_mode="Global" SpecialUse="Normal">
	<Values>
		<ChannelTypes>
			<PresetValue>
				<Handle name="L201 4.246">
					<No>1</No>
					<No>4</No>
					<No>246</No>
				</Handle>
				<ChannelType fixture_type="933+cc10couleurs 00" module="1" attribute="SCROLLER" />
			</PresetValue>
		</ChannelTypes>
	</Values>
</Preset>

<!--
Même preset que pérécédement mais avec la valeur lier à une autre preset.
Là aussi qu'un seul "ChannelType" par "PresetValue"
-------------------------------------------------------------------------------------------
-->

<Preset index="0" name="H_0 S_0" preset_mode="Universal" SpecialUse="Normal">
	<Values>
		<Attributes>
			<PresetValue Value="100">
				<Attribute name="COLORRGB1" />
			</PresetValue>
			<PresetValue Value="100">
				<Attribute name="COLORRGB2" />
			</PresetValue>
			<PresetValue Value="100">
				<Attribute name="COLORRGB3" />
			</PresetValue>
		</Attributes>
	</Values>
</Preset>

<!--
Ici il n'y a pas de "ChannelType" donc elle peut s'appliquer à tous les "FixtureType". Il faut récupérer les valeurs.
-->


Pour le cas numéro 3 actuellement ça ne récupère pas le "fixture_type" et le "attribute".
Et pour le cas 5 ça ne prend pas les valeurs.

p.s. PV doit être réservé à quelque chose car il me marquait une erreur. J'ai changé de nom et ça marche.
Commenter la réponse de wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
C'est bon j'ai trouvé.
Du coup maintenant quel est le moyen le plus simple pour visualiser ces données ?
datagridview ou autre ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ça dépend de ce que tu veux voir apparaître.
Tu peux avoir
  • un datagridview qui affiche tous les les presetspools, et quand tu cliques sur une ligne, un second datagridview affiche les Presets de la presetpool en question, etc...
  • un treeview qui t’affiche l’arborescence et quand tu cliques sur un noeud un datagridview t’affiche les données
  • tout mettre à plat, c’est à dire créer une autre collection ou chaque chaque items serait un presetValue auquel on a ajouté toutes les informations de ses parents. Et tout afficher dans un datagridview
  • autre en fonction de ton besoin

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
J’hésitais entre une listview et un datagridview mais j'ai commencé à utiliser un datagridview qui je pense sera le mieux.
A la suite de désérialisation des premiers messages:
            mesFixtures = (
                    From f In xDoc.Descendants("Fixture")
                    Select New Fixture With
                     {
                        .Nom = f.Attribute("name")?.Value,
                        .Numéro = f.Attribute("fixture_id").Value.ToInt(),
                        .NomType = f.Element("FixtureType")?.Attribute("name")?.Value
                     }).ToList() 

Je souhaiterais réarranger cette liste (ou en faire une autre) en regroupant tous les "NomType" équivalents avec pour chacun une liste de tous les numéros qui ont se "NomType".
J'ai essayé des choses mais je n'ai pas réussi.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Il faut utiliser la clause groupby.

 mesFixtures = (
                    From f In xDoc.Descendants("Fixture")
                    Select New Fixture With
                     {
                        .Nom = f.Attribute("name")?.Value,
                        .Numéro = f.Attribute("fixture_id").Value.ToInt(),
                        .NomType = f.Element("FixtureType")?.Attribute("name")?.Value
                     }).GroupBy(function(x) x.NomType).ToList


Dans ce cas mesFixtures n’est plus une liste de Fixture, mais une liste de KeyPairValue<string, Fixture> ou l’inverse.
Tu te retrouves avec une arborescence en premier les différents NomType et sous chaque noeud les Fixture correspondants.
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
Ça m'a l'air bien ça. C'est ce qu'on appel un dictionnaire ?
Je n'arrive pas à accéder à mesFixtures.NomType
Comment je procède pour savoir quels sont tout les Numéro d'un NomType donné ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
ha j'ai fait une erreur ce matin, ce ne sont pas des KeyPairValue, mais des IGrouping...

Un groupement, c'est un tri, un classement.
Tu peux classer un des gens par leur noms de famille.

Pour un dictionnaire une clé correspondant à une seule valeur, par exemple le numéro de sécu correspond à une personne.

        Dim mesFixturesGroupees As List(Of IGrouping(Of String, Fixture)) =
            (
                    From f In xDoc.Descendants("Fixture")
                    Select New Fixture With
                     {
                        .Nom = f.Attribute("name")?.Value,
                        .Numero = f.Attribute("fixture_id").Value.ToInt(),
                        .NomType = f.Element("FixtureType")?.Attribute("name")?.Value
                     }
             ).GroupBy(Function(x) x.NomType).ToList()

        Dim cle1 As String = mesFixturesGroupees(1).Key

        Dim laFixture As Fixture = mesFixturesGroupees.Single(Function(x) x.Key = "4 TW1 80V mode etendu Extended mode").Last() 'dernière fixture du groupement en question






Comme tu le voies, cela fait une arborescence, un treeviex associé à un datagridview est un affichage adapté
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
Avec :
 Dim laFixture As Fixture = mesFixturesGroupees.Single(Function(x) x.Key = "4 TW1 80V mode etendu Extended mode").Last()

On obtient le dernier élément.
Mais comment obtenir une liste de tous les numéros ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
A la place de Last tu fais un Select
Select(Funtion(toto) toto.Numero)

wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Ça me dit que la résolution de surcharge a échoué car aucun '[select]' accessible ne peut être appelé.
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ok, je testerai ce soir.
Mais je m’aperçois que j’ai écrit Funtion au lieu de Function

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
ok
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Ne cherche pas c'était effectivement le c qui manqué à Function et j'avais mis un accent sur numero dans la définition de Fixture, que j'ai enlevé.
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
J'ai tapé de tête sur ma tablette....
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,
Oui c'est moins facile sur tablette ou sur smartphone. En plus il y a des corrections automatiques qui sont parfois énervantes et les claviers sont plus petits.

je suis en train de vouloir afficher les données de mesFixturesGroupees dans le datagridview1, mais je n'y arrive pas, alors que ça fonctionnait avant le groupage. Quelles sont les différences ?.
P.S. je souhaite afficher seulement les .NomType regroupés.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Bonsoir

là encore cela te crée une arborescence, il y a "les clés", les valeurs par lesquelles c'est regroupé, et sous chaque clé les fixtures associées.

On peut créer une collection ou chaque item aura la clé et le nomtype, mais tu verras n fois la même clé.
On peut aussi utiliser un treeview ou 2 ListBix (pas forcément besoin de datagridview puisque tu ne veux voir qu'une valeur).

Dis moi ce qui te conviendrait le mieux
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
Je préférerais l'afficher dans un datagridview, puis quand je clique sur une ligne du datagridview ça m'affiche la liste des fixtures dans un deuxième datagridview.
C'est ce que j'avais réussi à faire.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ok, mais je tiens compte de ça
P.S. je souhaite afficher seulement les .NomType regroupés.

Ça va te faire 2 datagridview d'une colonne.
Ça me paraitrait plus logique d'afficher la fixture entière comme ceci
    Private mesFixturesGroupees As List(Of IGrouping(Of String, Fixture))
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        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é

        mesFixturesGroupees =
            (
                    From f In xDoc.Descendants("Fixture")
                    Select New Fixture With
                     {
                        .Nom = f.Attribute("name")?.Value,
                        .Numero = f.Attribute("fixture_id").Value.ToInt(),
                        .NomType = f.Element("FixtureType")?.Attribute("name")?.Value
                     }
             ).GroupBy(Function(x) x.NomType).ToList()

        DataGridView1.DataSource = mesFixturesGroupees


et dans le SelectionChanged de datagridview1
    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged

        Dim groupe As IGrouping(Of String, Fixture) = mesFixturesGroupees(DataGridView1.SelectedCells(0).RowIndex)


        DataGridView2.DataSource = groupe.ToList()
    End Sub

Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Mais si tu veux juste NomType alors
    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged

        Dim groupe As IGrouping(Of String, Fixture) = mesFixturesGroupees(DataGridView1.SelectedCells(0).RowIndex)


        DataGridView2.DataSource = groupe.Select(Function(x) x.NomType).ToList()
    End Sub
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,
Il y a une erreur quand je clique sur le dtagridview1 à la ligne :
Dim groupe As IGrouping(Of String, Fixture) = mesFixturesGroupees(DataGridView1.SelectedCells(0).RowIndex)

L'erreur est : System.NullReferenceException : 'Variable objet ou variable d'un bloc With non définie."
Cette erreur est présente pour les 2 propositions.
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
En faisant des recherches, il se trouve que c'est la portée de la variable mesFixturesGroupees qui n'est pas bonne. J'ai mis les datagridview sur une autre form je pense que le souci vient de là.
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
J'ai solutionné en déclarant une variable global en mettant mesFixturesGroupees dedans, car je n'arrivais pas à déclarer mesFixturesGroupees en public en tant que list. As tu une autre solution ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ha oui, il faut que tu passes la collection à ton autre formulaire.
Quelques façons de faire
https://codes-sources.commentcamarche.net/faq/11107-interactions-entre-form-en-net-c-et-vb-net
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Oui, voir mon message précédent.
Les variables globales, c’est pas conseillé.
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
J'ai encore un souci !
Je n'arrive pas à trier mon datagridview2 par rapport à la première colonne, qui est le numéro.
j'ai écrit ceci:
 DataGridView2.Sort(DataGridView2.Columns(0), System.ComponentModel.ListSortDirection.Ascending)

j'ai l'erreur:
System.InvalidOperationException : 'Pour être trié, un contrôle DataGridView doit être lié à l'objet IBindingList.
Sauf que moi le datagridview est lié à une liste. Peut être que la liste doit être triée avant de l'afficher dans le datagridview ?
Comment puis je faire ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Oui, une liste n'est par un IBindingList, le plus simple en effet est de trier avant avec un OrderBy

DataGridView2.DataSource = groupe.OrderBy(Function(x) x.Numero).ToList()


Tu devrais faire un tour là https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
Il y a 101 exemples d'utilisation de Linq, en C#, mais avec https://www.qwant.com/?q=c%23+to+vb&t=web ça sera en VB

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
Un petit message pour te dire que je n'ai pas abandonné, mais je n'ai pas beaucoup de temps à consacrer au développement en ce moment.
J'ai réussi à importer toutes les données dont j'avais besoin, maintenant reste la phase d'écriture du fichier.
Effectivement je suis conscient que j'ai plein de choses à apprendre et j'apprécie d'autant plus ton aide.
A bientôt.
Commenter la réponse de wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
0
Merci
Bonjour(soir)
De retour pour un problème.
J'ai un numéro de fixture pour lequel je veux récupérer son fixturetype ( dans la liste MesFixtures c.f. post 11) qui me permettra de récupérer ensuite des valeurs dans une autre liste.
Mais j'ai une erreur :


Comment dois-je déclarer MesFixtures car apparemment c'est ce qui ne va pas ?
Merci.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Bonsoir,

je rentre de quelques jours d'absence.
Il faut que je me replonge dans ton projet.
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Bonsoir,

dans le post 11, mesFixtures est une liste.
Une liste est parfaitement connue par Linq.
Donc ce n'est pas ça le problème à mon sens.

Peux tu poster un peu plus de code?
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,
Voici un peu plus de code :
                    Dim Fixtures_groupes_2_par_cues = Fixtures_par_cues.GroupBy(Function(n) n.Num_fixture).ToList()
                    For Each group In Fixtures_groupes_2_par_cues

                        strgBuilt.Append("$$AL " & group.Key.ToString & " 0 0 0 65535 0 0")
                        strgBuilt.AppendLine()

                        For Each attr In group

                            Select Case attr.Num_cobalt
                                Case 1 '  c'est le PAN
                                    If attr.Valeur < 0 Then
                                        Dim valtemp = (From fix In mesFixtures Where fix.Numero = group.Key.ToString Select fix)
                                    Else
                                    End If
                            End Select

                            strgBuilt.Append("$$A " & group.Key & " " & attr.Num_cobalt & " " & attr.Valeur & " " & attr.Num_type_param_cobalt & " 0 0 0 0 0 0 0")
                            strgBuilt.AppendLine()
                        Next
                    Next


Je dois récupérer le nom du FixtureType en fonction du numero du fixture (dans la liste mesFixtures)sous cette forme :

pour ensuite pouvoir récupérer la valeur minimal et maximale de ce paramètre (qui ce trouve dans la liste mesFixture_type)pour pouvoir calculer un pourcentage. mesFixture_type est sous cette forme :


C'est pass evident à expliquer !
Dis moi si il y a quelque chose que tu ne comprends pas ?
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
D'après le message d'erreur, il te manquerait un import en haut de ton fichier de code
https://docs.microsoft.com/fr-fr/dotnet/visual-basic/language-reference/error-messages/expression-of-type-type-is-not-queryable
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Oui j'ai vue ça dans mes recherches. Mais apparement tout y est.
Commenter la réponse de Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Si tu fais click droit / Atteindre la définition sur mesFixtures, tu arrives bien à une liste?
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
Non. J'arrive au début de la classe form1 ou j'ai déclarer mesFixtures en Public pour qu'elle soit accessible depuis toutes les sub.
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
0
Merci
Ça c’est pas le top, mais tu l’as bien déclaré comme une liste?
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
J'ai essayé mais quand je mets :
 Public mesFixtures As List(Of Fixture)

il me dit :
wholehog2
Messages postés
58
Date d'inscription
lundi 25 juin 2007
Statut
Membre
Dernière intervention
17 mai 2019
-
Il faut donc que je la déclare dans un module ?
Whismeril
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
Non, c’est à la classe qu’il faut ajouter le modificateur Public

Public class Fixture
Commenter la réponse de wholehog2
Messages postés
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
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
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308 -
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
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
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
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
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
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
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
13817
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 octobre 2019
308
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