От некоторого xml я хочу найти объекты, которые имеют определенный атрибут и значение.
Вот пример xml:
<node>
<node>
<node>
<special NAME="thisone"></special>
</node>
<node>
<special>dont want this one</special>
</node>
</node>
</node>
(узлы могут содержать узлы...),
Я должен найти, что первое на основе его имеет атрибут под названием "ИМЯ" и значение "thisone".
затем мне нужен его родитель (узел).
Я попробовал это:
specialItems = tempXML.*. (hasOwnProperty ("ИМЯ"));
но, казалось, ничего не сделал.
??
Спасибо!
В 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();
Если вы знаете, что узел, который вам нужен, является специальным
, тогда вы можете использовать:
var selected:XMLList = xml..special.(attribute("NAME") == "thisone");
вместо этого. Вот хорошее руководство по E4X .
Если вы используете синтаксис @NAME == "thisone"
, тогда вам понадобится атрибут NAME на всех ваших XML-узлах, но не при использовании атрибута ()
вместо синтаксиса оператора.
Я добавил вызов parent ()
выше; вы можете получить родительский элемент напрямую, используя дочерний элемент только в условном выражении:
xml..node.(child("special").attribute("NAME") == "thisone");
Вы можете сделать это двумя способами:
Вот пример:
//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\'s parent is: \n|XML BEGIN|' + filteredNode.parent()+'\n|XML END|');
//WITHOUGH E4X conditional
for each(var special:XML in xml2.node.node.*){
if(special.@NAME.length()){
if(special.@NAME == 'thisone') trace('for each loop: ' + special.toXMLString() + ' \n parent is: \n|XML BEGIN|\n' + special.parent()+'\n|XML END|');
}
}
На странице yahoo flash developer есть довольно хорошая и простая в освоении статья по E4X.