Как найти конкретные данные xml по имени/значению атрибута в flex/actionscript
Из некоторого xml я хочу найти элементы, которые имеют определенный атрибут и значение.
Вот пример xml:
<node>
<node>
<node>
<special NAME="thisone"></special>
</node>
<node>
<special>dont want this one</special>
</node>
</node>
</node>
(узлы могут содержать узлы...)
Мне нужно найти первый, основанный на нем, атрибут с именем "NAME" и значение "thisone".
тогда мне нужен его родительский элемент (node).
Я пробовал это:
specialItems = tempXML. *. (hasOwnProperty ( "NAME" ));
но, похоже, ничего не сделал.
??
Спасибо!
Ответы
Ответ 1
В ActionScript вы, скорее всего, будете использовать E4X, а не XPath. То, что вы хотите, может быть достигнуто следующим образом:
var xml:XML = <node>...</node>;
var selected:XMLList = xml.descendants().(attribute("NAME") == "thisone");
var first:XML = selected[0];
var parent:XML = first.parent();
Если вы знаете node, вы хотите special
, то вы можете использовать:
var selected:XMLList = xml..special.(attribute("NAME") == "thisone");
вместо этого. Здесь хороший учебник E4X.
Если вы используете синтаксис @NAME == "thisone"
, вам нужен атрибут NAME на всех ваших узлах XML, но если вы не используете синтаксис оператора attribute()
.
Я добавил вызов parent()
выше; вы можете напрямую получить родителя, используя дочерний элемент только в условном выражении:
xml..node.(child("special").attribute("NAME") == "thisone");
Ответ 2
Вы можете сделать это двумя способами:
- добавьте атрибут NAME ко всем вашим специальным узлам, чтобы вы могли использовать условия E4X (xml)
- используйте цикл, чтобы пройти через специальные узлы и проверить, есть ли на самом деле атрибут NAME (xml2)
Вот пример:
//xml with all special nodes having NAME attribute
var xml:XML = <node>
<node>
<node>
<special NAME="thisone"></special>
</node>
<node>
<special NAME="something else">dont want this one</special>
</node>
</node>
</node>
//xml with some special nodes having NAME attribute
var xml2:XML = <node>
<node>
<node>
<special NAME="thisone"></special>
</node>
<node>
<special>dont want this one</special>
</node>
</node>
</node>
//WITH 4XL conditional
var filteredNodes:XMLList = xml.node.node.special.(@NAME == 'thisone');
trace("E4X conditional: " + filteredNodes.toXMLString());//carefull, it traces 1 xml, not a list, because there only 1 result,otherwise should return
//getting the parent of the matching special node(s)
for each(var filteredNode:XML in filteredNodes)
trace('special node\ parent is: \n|XML BEGIN|' + filteredNode.parent()+'\n|XML END|');
//WITHOUGH E4X conditional
for each(var special:XML in xml2.node.node.*){
if([email protected]()){
if([email protected] == 'thisone') trace('for each loop: ' + special.toXMLString() + ' \n parent is: \n|XML BEGIN|\n' + special.parent()+'\n|XML END|');
}
}
Существует довольно хорошая и простая статья о статье E4X на странице yahoo flash.