E4X / AS3, получить массив текстовых элементов без зацикливания

это часть XML-файла, полученного мной с помощью AS3 E4X:

<links>
    <link>
      <label>Versions</label>
      <href>http://mylink1</href>
    </link>
    <link>
      <label>Configurations</label>
      <href>http://myLink2</href>
    </link>
</links>

Я хочу получить значения меток, поэтому пишу:

document.links.link.label.text();

Это возвращает VersionsConfigurations. Мне это нужно как массив ([Версии, Конфигурации]), но я бы не хотел использовать цикл. Есть ли другой способ?


person Community    schedule 25.07.2011    source источник
comment
Извините, я нашел один способ и хочу поделиться им со всеми вами. Вы можете сделать это, написав document.links.link.label.text (). ToXMLString (). Slice (\ n). Метод toXMLString () добавляет полезный (недокументированный) \ n, и вы можете использовать его для разделения строки. Конечно, это приводит к строке XML   -  person    schedule 25.07.2011
comment
Вы можете публиковать ответы на свои вопросы, хотя вам придется подождать 2 дня, прежде чем вы сможете принять свой ответ.   -  person shanethehat    schedule 25.07.2011


Ответы (2)


Что ж, это решение "не пробуйте это дома", но вот оно что. :)

Вы можете использовать выражение поиска E4X, чтобы делать все, что вы хотите, с узлами XMLList.

Это работает следующим образом: someXMLList.(expression), где выражение - это любой код AS3, который может получить доступ к свойствам и методам каждого узла без необходимости уточнения их имен. Например, вы можете сделать следующее:

yourXML.descendants("label").(trace("label text: ", text()));

Обратите внимание, что здесь я использую text() без доступа . операций. Фактически это вернет новый XMLList для всех узлов, где выражение оценивается как true. Поскольку trace() возвращает void, результирующий список будет пустым. Внутри, конечно, есть цикл через все узлы XMLLIst, который создается вызовом descendants() (или использованием оператора ..).

Таким же образом можно построить и свой массив.

var doc:XML = 
<links>
    <link>
      <label>Versions</label>
      <href>http://mylink1</href>
    </link>
    <link>
      <label>Configurations</label>
      <href>http://myLink2</href>
    </link>
    <link>
      <label>A label
with
multiple
line 
breaks</label>
      <href>http://myLink3</href>
    </link>
</links>;

trace(doc.descendants("label").text().toXMLString().split("\n"));
/* Trace output (incorrect):
Versions,Configurations,A label
,with
,multiple
,line 
,breaks
*/

var list:Array = [];
doc.descendants("label").(list.push(text().toString()));
trace(list);
/* Trace output (correct):
Versions,Configurations,A label

with

multiple

line 

breaks
*/

Это может быть полезно при выполнении некоторых сложных поисков в XMLList. Однако в вашем случае я думаю, вам следует вместо этого использовать простое разделение строкового представления или регулярного выражения, как предлагает Шейн.

person Michael Antipin    schedule 26.07.2011
comment
Это интересно! Еще один глупый вопрос: есть ли способ сжать этот 2-строчный список var: Array = []; d.descendants (метка). (list.push (текст (). toString ())); в единственном присваивании массиву списков? Скажем, var list = ... - person ; 27.07.2011
comment
Большинство выражений E4X возвращают список XMLList, созданный в соответствии с предоставленными вами правилами. Выражения поиска работают таким образом независимо от того, что вы делаете в круглых скобках. В ответе выше я использовал выражение поиска как ярлык для циклического просмотра элементов XMLList. Но вы по-прежнему не можете полагаться на возвращаемое значение, и вам нужно создать пустой массив где-то вне выражения поиска. - person Michael Antipin; 27.07.2011

Альтернативным методом может быть использование регулярного выражения, хотя этот конкретный пример зависит от ваших меток, которые всегда начинаются с заглавной буквы и в противном случае содержат только символы нижнего регистра.

var regex:RegExp = /[A-Z][a-z]+/g;
var inString:String = "VersionsConfigurations";
var outArray:Array = inString.match(regex);
trace(outArray.length); // 2
person shanethehat    schedule 25.07.2011
comment
Шейн, я пробовал такие методы, но в этом XML есть разные правила для каждого узла! Этикетка - это только один пример, их много, и каждый создает разные проблемы. Я попытался предложить структуру XML, но, похоже, есть CMS, которая создает проблемы для нас, разработчиков flash :-) - person ; 25.07.2011
comment
Кажется, ваш путь в любом случае безопаснее, пока в вашем XML не появятся новые строки :) - person shanethehat; 25.07.2011
comment
Это toXMLString (), который добавляет строки - person ; 25.07.2011