[AS3] XML filteren op meerdere child elementen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Topicstarter
Ik heb een XML bestand met de volgende structuur (de waarden zijn min of meer random gekozen):

XML:
1
2
3
4
5
6
7
8
9
10
11
12
<root>
    <item name="item 1">
        <range start="1111" end="2222"/>
        <range start="3333" end="4444"/>
        <range start="7460" end="7468"/>
    </item>
    <item name="item 2">
        <range start="1111" end="2222"/>
        <range start="2640" end="7650"/>
        <range start="7670" end="7690"/>
    </item>
</root>


In Flex (AS3) heb ik deze data in een XML object zitten en ik zou graag willen uitvragen welke items de waarde 2000 in hun range hebben. Dit probeer ik met behulp van de volgende code:

code:
1
2
var value  : int = 2000;
var result : XMLList = datasource.item.(range.@start <= value && range.@end >= value);


Dit lijkt goed te werken maar wanneer ik ga vragen naar welke items bijvoorbeeld de waarde 7671 hebben dan blijft mijn result angstvallig leeg. Ook wanneer ik de waarde 1111 gebruik, iets waar ik ook nog geen logische verklaring voor heb gevonden.

Als ik de range elementen direct in het root element zet en de uitvraag welke range elementen de waarde 7671 bevatten dan krijg ik wel de goede elementen terug. Volgens mij gaat er dus iets mis wanneer ik meerdere child elementen binnen een element wil evalueren. Weet iemand hier een oplossing op?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik ben niet bekend met AS, maar het lijkt me dat je met datasource.item alleen het eerste item element benadert; ik heb geen idee hoe je het anders moet noteren, maar je wil dus alle items benaderen dus iets van

code:
1
datasource.(item.(range.@start <= value && range.@end >= value));

of
code:
1
datasource.(item.range.@start <= value && item.range.@end >= value);

of
code:
1
datasource.item[](...)

lijkt me :? Overigens snap ik dan niet waarom 1111 niets terug geeft tenzij je voorbeeld niet klopt.

[ Voor 8% gewijzigd door RobIII op 22-09-2009 15:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Topicstarter
Ik weet zeker dat alle twee de items worden benaderd, als ik bij item 1 de range van 1111 tot 2222 weghaal dan krijg ik keurig terug dat alleen item 2 voldoet. Bovendien werkt het goed wanneer de range elementen direct in de het root element worden geplaatst (en dus de items in principe laat vervallen).

Ik heb je suggesties even geprobeerd, om toch alles uit te kunnen sluiten. Suggestie 1 geeft als resultaat het volledige XML document, dit is wat ik het verwacht. Suggestie 2 geeft helemaal geen resultaten terug, zelfde voor suggestie 3.

[ Voor 28% gewijzigd door Lorn op 22-09-2009 15:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer het eens zo:

code:
1
var result : XMLList = datasource.item.range.(@start <= value && @end >= value);

[ Voor 7% gewijzigd door Verwijderd op 22-09-2009 16:05 ]


Acties:
  • 0 Henk 'm!

  • dlmh
  • Registratie: Januari 2000
  • Laatst online: 17-09 09:11

dlmh

Lo-Fi

RobIII schreef op dinsdag 22 september 2009 @ 15:17:
Ik ben niet bekend met AS, maar het lijkt me dat je met datasource.item alleen het eerste item element benadert; ik heb geen idee hoe je het anders moet noteren, maar je wil dus alle items benaderen dus iets van

code:
1
datasource.(item.(range.@start <= value && range.@end >= value));

of
code:
1
datasource.(item.range.@start <= value && item.range.@end >= value);

of
code:
1
datasource.item[](...)

lijkt me :? Overigens snap ik dan niet waarom 1111 niets terug geeft tenzij je voorbeeld niet klopt.
Met Actionscript 3.0 wordt er gebruik gemaakt van E4X (Ecmascript for XML), die een geheel eigen syntax hanteert voor het doorlopen van een XML boom. De gebruikte syntax is juist, alleen denk ik dat de TS bedoelt:
code:
1
range.@start >= value && range.@end <= value

“If a cluttered desk is a sign of a cluttered mind, of what, then, is an empty desk a sign?” - Albert Einstein


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Topicstarter
Verwijderd schreef op dinsdag 22 september 2009 @ 16:04:
Probeer het eens zo:

code:
1
var result : XMLList = datasource.item.range.(@start <= value && @end >= value);
Als je dat doet dan krijg je alleen het range element dat voldoet aan de voorwaarde en niet het item.
SerialThrillaZ schreef op dinsdag 22 september 2009 @ 16:12:
[...]

Met Actionscript 3.0 wordt er gebruik gemaakt van E4X (Ecmascript for XML), die een geheel eigen syntax hanteert voor het doorlopen van een XML boom. De gebruikte syntax is juist, alleen denk ik dat de TS bedoelt:
code:
1
range.@start >= value && range.@end <= value
Het is nog vroeg maar volgens mij klopt dit niet. Nou vraag je de elementen op waarvan de start waarde groter of gelijk is als de waarde waarop je zoekt en een eind waarde die kleiner of gelijk is dan waar je op zoekt... Ik wil juist dat de gezocht waarde tussen de begin en eind waarde ligt.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01 11:03

Lorn

I have a bad feeling...

Topicstarter
Verwijderd schreef op dinsdag 22 september 2009 @ 16:04:
Probeer het eens zo:

code:
1
var result : XMLList = datasource.item.range.(@start <= value && @end >= value);
Ik heb dit toch even in mijn code geprobeerd en het levert wel een bijzonder resultaat op. Zoals verwacht krijg ik range elementen terug maar deze code geeft wel de juiste range elementen terug. Als ik zoek op 1111 dan werkt dat correct. Ook een waarde als 7680 geeft het juiste resultaat.

Vreemd dat dit wel de juiste elementen laat zien maar dat het mis gaat zodra je het betrekt op het item element.

Verwijderd

Lorn schreef op woensdag 23 september 2009 @ 07:35:

Als je dat doet dan krijg je alleen het range element dat voldoet aan de voorwaarde en niet het item.
Ja je krijgt daarmee idd de range elementen terug, terwijl eigenlijk de items wilt. Ik heb ook van alles geprobeerd maar het lukt mij ook niet om de items terug te krijgen. Je kan dit natuurlijk oplossen door van alle elementen in het resultaat de parent te pakken, op deze manier heb je wel de goede items te pakken.

Het is geen mooie oplossing, maat het is mij niet op een andere manier gelukt.

[ Voor 21% gewijzigd door Verwijderd op 23-09-2009 12:55 ]

Pagina: 1