E4X / AS3, получить массив текстовых элементов без зацикливания - PullRequest
0 голосов
/ 25 июля 2011

это часть 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,Мне нужно это как Array ([Версии, Конфигурации]), но я бы не хотел использовать цикл.Есть ли другой способ?

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Ну, это решение "не пытайтесь делать это дома", но вы здесь.:)

Вы можете использовать поисковое выражение 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.Однако в вашем случае я думаю, что вместо этого вы должны использовать простое разбиение строкового представления или регулярного выражения, как предлагает Шейн.

0 голосов
/ 25 июля 2011

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

var regex:RegExp = /[A-Z][a-z]+/g;
var inString:String = "VersionsConfigurations";
var outArray:Array = inString.match(regex);
trace(outArray.length); // 2
...