Как найти конкретные данные 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.