как найти, что определенные данные XML названием атрибута / оценивают в гибком проводе / actionscript

От некоторого xml я хочу найти объекты, которые имеют определенный атрибут и значение.

Вот пример xml:

<node>
 <node>
  <node>
   <special NAME="thisone"></special>
  </node>
  <node>
   <special>dont want this one</special>
  </node>
 </node>
</node>

(узлы могут содержать узлы...),

Я должен найти, что первое на основе его имеет атрибут под названием "ИМЯ" и значение "thisone".

затем мне нужен его родитель (узел).

Я попробовал это:

specialItems = tempXML.*. (hasOwnProperty ("ИМЯ"));

но, казалось, ничего не сделал.

??

Спасибо!

10
задан Deduplicator 10 February 2015 в 22:37
поделиться

2 ответа

В 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");        
16
ответ дан 3 December 2019 в 21:21
поделиться

Вы можете сделать это двумя способами:

  1. добавить атрибут NAME ко всем вашим специальным узлам, так что вы можете использовать условия E4X(xml)
  2. использовать цикл для перебора специальных узлов и проверки наличия атрибута 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\'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.

1
ответ дан 3 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: