快速而高效地搜索XML数据

[url]http://bbs.9ria.com/viewthread.php?tid=75361&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D2592000[/url]

项目组中,大多数人喜欢使用XML作为数据交接桥梁,常会碰到对XML进行大批量搜索与提取,比如下面的XML文件:
XML/HTML代码

var xml:XML=<xml>
<item id="6" title="商创博客"/>
<item id="12" title="商创技术"/>
<item id="43" title="shch8.com"/>
<item id="26" title="webBase"/>
<item id="17" title="shch8.com/webbase"/>
</xml>;


我想提取id大于20的数据,你会怎么做?

用for和 if 循环判断id>20,如果你真是这样做的,看到这篇blog因该感到幸运了!

我有3000条数据,你还用for的话,那是个很吃力的过程了。

1.AS3的XML实现了E4X的处理标准,配合XML与XMLList的取值方法可以很灵活地操作XML数据,正确的做法因该是:

AS3代码

trace(xml.child("*").(@id>20))
/*输出
<item id="43" title="shch8.com"/>
<item id="26" title="webBase"/>
*/


当然,也可以这样写

AS3代码
trace(xml.item.@id>20)  


使用XML结点名取值,结果是一样的。

2.接下来,我们还可以针对title进行搜索,代码:

AS3代码

var xml:XML=<xml>
<item id="6" title="商创博客"/>
<item id="12" title="商创技术"/>
<item id="43" title="shch8.com"/>
<item id="26" title="webBase"/>
<item id="17" title="shch8.com/webbase"/>
</xml>;
var searchKey:String="商创"
trace(xml.child("*").(@title.indexOf(searchKey)!=-1));
/*输出
<item id="6" title="商创博客"/>
<item id="12" title="商创技术"/>
*/



3.或许你会说我太土了,用indexOf进行字符判断,为什么不用正则表太式?是的,可以这样写

AS3代码

xml.child("*").(pattern.test(@title));


但这并不是RegExp可识别的方法,我们再改下,写个函数代理判断

AS3代码

var xml:XML=<xml>
<item id="6" title="商创博客"/>
<item id="12" title="商创技术"/>
<item id="43" title="shch8.com"/>
<item id="26" title="webBase"/>
<item id="17" title="shch8.com/webbase"/>
</xml>;
var searchKey:String="shch"
var pattern:RegExp=new RegExp(searchKey);
trace(xml.child("*").(regTest(@title)));
function regTest(obj:String):Boolean{
return pattern.test(obj)
}
/*输出
<item id="43" title="shch8.com"/>
<item id="17" title="shch8.com/webbase"/>
*/


4.最后,我们取到的数据,都是xmlList类型,你在使用时如果喜欢用XML来操作,那可以再创建一个XML对象

AS3代码

var xml:XML=<xml>
<item id="6" title="商创博客"/>
<item id="12" title="商创技术"/>
<item id="43" title="shch8.com"/>
<item id="26" title="webBase"/>
<item id="17" title="shch8.com/webbase"/>
</xml>;
var searchKey:String="shch"
var pattern:RegExp=new RegExp(searchKey);
var getXML:XML=<data/>
getXML.appendChild(xml.child("*").(regTest(@title)))
trace(getXML)
function regTest(obj:String):Boolean{
return pattern.test(obj)
}
/*输出
<data>
<item id="43" title="shch8.com"/>
<item id="17" title="shch8.com/webbase"/>
</data>
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值