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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
- 17 mai 2019 à 20:21
Bonjour,

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

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="styles/fixture+layer+layers@html@default.xsl"?>
<?xml-stylesheet type="text/xsl" href="styles/fixture+layer+layers@csv.xsl" alternate="yes"?>
<MA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.malighting.de/grandma2/xml/MA" xsi:schemaLocation="http://schemas.malighting.de/grandma2/xml/MA http://schemas.malighting.de/grandma2/xml/3.6.1/MA.xsd" major_vers="3" minor_vers="6" stream_vers="1">
<Info datetime="2019-04-01T09:20:42" showfile="macbeth-test" />
<Layers index="3">
<Layer index="1" name="gradateurs">
<Fixture index="0" name="Dim 68" fixture_id="68" channel_id="68">
<FixtureType name="2 Dimmer 00">
<No>2</No>
</FixtureType>
<SubFixture index="0" react_to_grandmaster="true" color="ffffff">
<Patch>
<Address>143</Address>
</Patch>
<AbsolutePosition>
<Location x="0" y="0" z="0" />
<Rotation x="0" y="-0" z="0" />
<Scaling x="1" y="1" z="1" />
</AbsolutePosition>
<Channel index="0" />
</SubFixture>
</Fixture>


Voila ce que j'ai codé:


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

For Each listfixture In listPatch

If listfixture.HasElements Then

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

Dim u As Integer = 0

For Each fixture In Fixtures

If fixture.HasElements Then

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

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

End If
Next

End If

Next


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

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

Votre réponse

20/88 réponses

Messages postés
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274 -
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274 -
Ok
Commenter la réponse de Whismeril
Messages postés
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274 -
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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
13316
Date d'inscription
mardi 11 mars 2003
Statut
Non membre
Dernière intervention
25 mai 2019
274
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