Как фильтровать узлы xml по вложенным дочерним значениям в ActionScript 3?

у меня очень простой сценарий, где у меня есть структура, похожая на эту

<tours>
    <tour>
        <name>Italy 1</name>
        <destinations>
            <destination>Rome</destination>
            <destination>Milan</destination>
        <destinations>
    </tour>
    <tour>
        <name>Italy 2</name>
        <destinations>
            <destination>Rome</destination>
            <destination>Venice</destination>
        <destinations>
    </tour>
</tours>

теперь я хочу запросить все туры, которые идут в Милан.

Ниже приведен логический формат, который я могу придумать на основе стиля EX4

XmlData.tour.(destinations.destination.(name == "Milan"))

но конечно это не работает.

каков правильный способ извлечения этих данных без использования какой-либо дополнительной логики?

3 ответов


XmlData.tour.destinations.destination is XMLList. Он содержит XMLs, который выглядит как <destination>Milan</destination> каждый из этих XML есть name = destination, так что вы ничего не получите в результате.

попробуйте это:

XmlData.tour.(destinations.destination.children().contains("Milan"));

1) плохо отформатированный xml. (отсутствует ' / ' при закрытии пунктов назначения)

2) Вы, похоже, столкнулись с какой-то ошибкой в AS3 E4X-finder. Это было действительно странно, вот обходной путь...

var foo:XMLList = data.tour.destinations.(destination == "Milan");
trace("direct check:  " + foo); //fails - 0 matches
trace("------");
for each(var child:XML in data.tour.destinations.destination) {
    if (child == "Milan") {
        trace("found match in foreach Milan");
    }
}

дальнейшее исследование, похоже, что e4x-engine завинчивается, так как у вас есть несколько детей внутри тега с тем же идентификатором (<destination>).

набрав следующее, "функция фильтра" ведет себя так, как ожидалось:

<destinations>
<destination2>Rome</destination2>
<destination>Milan</destination>
</destinations>

.... это действительно странно... Кто-нибудь может рассказать подробнее? Потому что в соответствии с xml-стандартами E4X это должно быть возможно сделать так, как это сделано в вопросе.


этот скрипт поможет вам создать новый xml из вашего XmlData, но только с турами, включая пункт назначения в Милан:

var DESTINATION_TO_CHECK:String = "Milan";
var i:int;
var j:int;
var numberOfTours:int = XmlData.tour.length();
var numberOfDestinations:int;
var tours:String = "<tours to='" + DESTINATION_TO_CHECK + "'>";

for (i = 0; i < numberOfTours; i++)
{
    numberOfDestinations = XmlData.tour[i].destinations.destination.length();

    for (j = 0; j < numberOfDestinations; j++)
    {
        if (XmlData.tour[i].destinations.destination[j] == DESTINATION_TO_CHECK)
        {
            tours += XmlData.tour[i];
        }
    }
}

tours += "</tours>";

trace(new XML(tours));