19.2.1 问题
对于一个基于多个字段(attribute)的属性值的XML文件, 应如何选取其中的节点?
19.2.2. 解决办法
使用E4X语法的”@”运算符来存取属性, “([])运算符(数组索引)”是用来指示多个子节点之间的关系, 而”.”运算符则用来表示已命名子节点之间的关系。
19.2.3. 讨论
通过E4X, 你可以在子节点的名称后附加一个”.”运算符, 这样你就可以存取XML文件中特定的子节点。
例如, 从以下的文件中
var xml:XML = <foo>
<bar>Hello World</bar>
</foo>
你可以通过以下的方法来存取<bar>的数值:
xml.bar
由于<foo>为该XML对象的根节点, 所以无需对其进行引用。
要存取一个文件中节点的属性, 例如:
var xml:XML = <foo>
<bar type="salutation">Hello World</bar>
</foo>
可以使用”@”运算符来指定所需的属性值为一个字段:
xml.bar.@type
要存取多个名称相同的子节点, 可以使用”[]”运算符。 好像以下的例子:
var xml:XML = <foo>
<bar type="salutation">Hello World</bar>
<bar type="salutation">Hola</bar>
<bar type="salutation">Guten Tag</bar>
</foo>
你可以使用以下的方法来存取<bar>系列的第三个对象:
xml.bar[2].@type
对于一个用以定义在菜单上项目的简单XML结构, 可以使用如下的代码段:
private var xmlItems:XML = <order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
private var arr:Array;
private function init():void {
arr = new Array();
for each(var xml:XML in xmlItems.item) {
arr.push(Number(xml.@id));
}
}
要对属性值或节点进行测试的话, 可以使用相等运算符(==):
trace(xmlItems.item.(@id == "2").menuName);
任何符合条件的节点都会被返回, 否则就会被忽略。 以下的例子会把Label组件的text属性设置为一个id等于2的item的menuName:
private var xmlItems:XML = <order>
<item id="1">
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id="2">
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
private function init():void {
xmlLabel.text = xmlItems.item.(@id == "2").menuName;
}
]]>
</mx:Script>
<mx:Label id="xmlLabel"/>
相等(==)跟不等(!=)运算符两者都可以用来测试一个属性或节点的值, 它们可以为字符串或数字, 所返回的结果为一个布朗值。