20.14.搜索XML

问题
我想根据某种规则搜索出XML对象的节点或属性
解决办法
使用E4X 语法和XML对象的过滤器来筛选出特定的值
讨论
这一章讨论了如何用E4X 语法读写XML对象,通过E4X的XPath 来搜索XML文档,E4X称得上是最简单的也是最强大的工具,如果你熟悉XPath的话,可用E4X的高级特性(如果过滤器)它可根据布尔表达式筛选出指定元素节点。

现在我们开始练习,首先创建一个XML:
+展开
-ActionScript
var foodgroup:XML = <foodgroup>
<fruits>
<fruit color="red">Apple</fruit>
<fruit color="orange">Orange</fruit>
<fruit color="green">Pear</fruit>
<fruit color="red">Watermelon</fruit>
<servings>3</servings>
</fruits>
<vegetables>
<vegetable color="red">Tomato</vegetable>
<vegetable color="brown">Potato</vegetable>
<vegetable color="green">Broccoli</vegetable>
<servings>2</servings>
</vegetables>
</foodgroup>;

如果你事先知道元素节点名称,可直接通过点操作符定位,例如,要返回<fruit>元素节点集合,可使用下面的表达式:
+展开
-ActionScript
var fruitList:XMLList = foodgroup.fruits.fruit;

如果只关心某个<fruit> 元素节点,可根据索引值访问:
+展开
-ActionScript
var theApple:XML = foodgroup.fruits.fruit[0];

如果你不知道某个节点的完整路径,可使用双点操作符来定位,例如,下面的表达式返回所有<vegetable>节点:
+展开
-ActionScript
var vegetableList:XMLList = foodgroup..vegetable;

(*) 即为“任意节点”,如下面的表达式返回所有<servings>元素节点:
+展开
-ActionScript
var servings:XMLList = foodgroup.*.servings;

@ 符号用来访问属性,下面的例子返回<fruit> 节点下的color属性集合:
+展开
-ActionScript
var colorValues:XMLList = foodgroup.fruits.fruit.@color;

好,现在我们看一下过滤器,使用(条件)语法来筛选特定的元素节点,条件表达式为布尔值,过滤器作用在XML 或XMLList 对象上。

例如,想筛选出<fruit>元素所有color属性为red的节点集合,可设置表达式为@color == "red"
+展开
-ActionScript
/* 显示:
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
*/

trace( foodgroup..fruit.( @color == "red" ) );

在这个例子中的表达式分为两部分:
foodgroups..fruit 部分返回所有<fruit> 元素节点。
过滤器应用在<fruit>节点的XMLList集合上并产生新的XMLList 对象。

上面的例子选出color属性为red的<fruit>元素节点,但是如果我想选出所有color属性为red的元素节点呢?这时可使用*号选出任何节点其color属性red的元素节点:
+展开
-ActionScript
/* 显示:
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
<vegetable color="red">Tomato</vegetable>
*/

trace( foodgroup..*.( hasOwnProperty( "@color" ) && @color == "red" ) );

上面的例子中,hasOwnProperty 检查元素是否有color属性,如果有在检查其值是否为red 。.

过滤不仅仅用于筛选属性,还可筛选元素节点,例如下面的例子显示<fruit>元素节点的<name>元素节点的文本值为Apple的color属性值:
+展开
-ActionScript
var fruits:XML = <fruits>
<fruit color="red">
<name>Apple</name>
</fruit>
<fruit color="orange">
<name>Orange</name>
</fruit>
<fruit color="green">
<name>Pear</name>
</fruit>
<fruit color="red">
<name>Watermelon</name>
</fruit>
</fruits>;
// 显示: red
trace( fruits.fruit.(name == "Apple").@color );

可以看到过滤器的功能是如此强大,如果和正则表达式联合使用,那将会更强大,如下面的例子使用正则表达式来找出<fruit>节点<name>节点的文本节点值中包含原因字母的集合:
+展开
-ActionScript
var fruits:XML = <fruits>
<fruit color="red">
<name>Apple</name>
</fruit>
<fruit color="orange">
<name>Orange</name>
</fruit>
<fruit color="green">
<name>Pear</name>
</fruit>
<fruit color="red">
<name>Watermelon</name>
</fruit>
</fruits>;
/* 显示:
<fruit color="red">
<name>Apple</name>
</fruit>
<fruit color="orange">
<name>Orange</name>
</fruit>
*/

trace( fruits.fruit.( /^[aeiouAEIOU].*/.test( name ) ) );

上面的代码创建了一个正则表达式(/之间的内容/),表示起始字母为元音字母,大小写无关,后面跟随任意字母。test( ) 方法测试name 元素节点的文本节点值是否符合要求。

加支付宝好友偷能量挖...


评论(0)网络
阅读(115)喜欢(0)flash/flex/fcs/AIR