AS3 / XML - Как получить список узлов, у которых есть определенный тег со значением X

У меня есть XML-файл, в котором много узлов примерно следующего содержания:

<animal name="dog">
    ...
    <tag>mammal</tag>
    <tag>brown</tag>
</animal>

Я надеюсь использовать узел tag как часть функции поиска определенных животных. Так, например, я мог бы составить список всех млекопитающих.

Я играл с чем-то вроде этого:

myXML..tag=="mammal" or myXML.*.tag=="mammal"

Также попытался переключить tag на наличие атрибута (например: <tag type="brown"/>), а затем выполнить поиск, используя что-то вроде myXML..tag.@type=="brown", но, увы, оба метода приводят к чему-то бесполезному, например, «false».

Я не особо хочу перебирать каждый узел, чтобы попытаться найти это, так как у меня их слишком много, и их нужно искать довольно часто. Итак, если есть какой-то волшебный способ (возможно, не XML), я могу ввести значение поиска или тег, и он вернет список или массив каждого animal.@name, имеющего указанный тег.

Об этом как бы спрашивали раньше, но не совсем так, и на самом деле никогда не отвечали (что я мог найти).


person HalfBit    schedule 23.01.2014    source источник


Ответы (1)


Попробуйте с этим,

var xml:XML = <animal name="dog">               
        <tag type="mammal">mam</tag>
        <tag type="brown">br</tag>                      
        <tag type="black">bl</tag>                      
        <tag type="black">black</tag>
      </animal>;

var attr:String = "black";              
var val:String = "b";
var resultList:XMLList = xml..tag.(@type == attr).(toString().indexOf(val)>-1);

o/p:

<tag type="black">
  bl
</tag>
<tag type="black">
  black
</tag>

В любом случае вы всегда используете цикл для повышения производительности. e4X Slow. Прочтите внимательно 15 пункт.

На основании вашего комментария:

var myXML:XML = <animal name="dog">                                     
                         <tag type="mammal">true</tag>                  
                         <tag type="brown">true</tag>                   
                         <tag type="black">true</tag>                                   
                    </animal>;                  

                for each(var tag:XML in myXML..tag) //no matter of depth Note here
                {
                    if (tag.@type == "mammal") 
                    { 
                        trace(tag.parent().@name); 
                        trace(tag.text()); 
                    } 
                }
person Raja Jaganathan    schedule 23.01.2014
comment
Вышеупомянутое до сих пор не сработало, но, по вашему совету, я попытаюсь вместо этого повторить его. Но пока безуспешно. Использование XML с такими тегами, как <tag type="mammal">true</tag>, и циклическое прохождение с помощью: для каждого (животное: XML в myXML) {if (animal.tag. @ Type == mammal) {trace (animal. @ Name); }} Однако ничего не отображается. Ничего не прослеживается. - person HalfBit; 24.01.2014
comment
Сначала у меня все хорошо, и лучше вы можете поставить точку останова, а затем проверить значение resultList. Проблема в вашем цикле и животном xml во всем вашем XML, поэтому цикл всегда выполняется один раз. Можете ли вы определить свою XML-структуру. Обновленный ответ может быть полезен. - person Raja Jaganathan; 24.01.2014
comment
Красивый. Принятый. Ваша обновленная функция цикла работает отлично. Спасибо, вы очень помогли и оперативно. - person HalfBit; 24.01.2014