E4X / AS3,获取一个没有循环的文本元素数组

时间:2011-07-25 08:46:21

标签: actionscript-3 e4x

这是我使用AS3 E4X检索的XML文件的一部分:

<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。我需要它作为数组([版本,配置]),但我不想使用循环。还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

嗯,这是一个“不要在家尝试这个”的解决方案,但是你在这里。 :)

您可以使用E4X搜索表达式对XMLList的节点执行任何操作。

其工作原理如下:someXMLList.(expression),其中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上执行一些复杂的搜索时,这可能很有用。但是在你的情况下,我认为你应该使用简单的字符串表示法或正则表达式的分割,如Shane建议的那样。

答案 1 :(得分:0)

另一种技术可能是使用正则表达式,尽管这个特殊的例子取决于你的标签总是以大写字母开头,否则只包含小写字符。

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