Как фильтровать узлы 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));