做项目时,树的数据太多,需要搜索功能辅助。以前做了几个针对项目的,别人跟着我的源码粘贴、复制,还是老出错,调不好,到头来还是哥的活,适逢难得清闲,干脆做了个通用的类,留着备用。
功能:从XML中搜索符合条件的条目,并按照关键词返回结果XML,保持目录的结构不变。参数用了数组,支持多关键字,多标签名,多属性的搜索。
package workflow.unlimitedLeverSearch
{
/**
*功能: 无限级XML搜索
* @author 王小白_2011-07-26 18:31:59
* */
public class XmlSearch
{
private var queryTagName:Array;
private var queryAttributes:Array;
private var parameters:Array;
private var newXmlStr:String;
public function XmlSearch()
{
}
/**
* 无限级XML搜索
* @param xml: 要搜索的xml 类型 xml
* @param queryTagName: 要查询的标签名 类型 Array
* @param queryAttributes: 要查询的属性 类型Array
* @param keyWords: 要查询的关键字 类型:String
* @author 王小白 2011-07-26 21:13:32
* */
public function getXmlByLabel(xml:XML,queryTagName:Array,queryAttributes:Array,keyWords:String):String{
this.parameters=keyWords.split(" ");
this.queryTagName=queryTagName;
this.queryAttributes=queryAttributes;
this.newXmlStr="";
this.doLoop(xml,1);
return newXmlStr;
}
private function doLoop(xml:XML,top:int):String{
var OutTempStr:String="";
for each(var item:XML in xml.children()){
var tagName:String=item.localName();
var innerTempStr:String=getXmlNodeString(item);
var hasMark:Boolean=false;
var childReturn:String="";
if(checkTag(tagName,queryTagName)){ for(var i:int=0;i<queryAttributes.length;i++){ var attrVal:String=item.attribute(queryAttributes[i]).toString(); if(validate(attrVal,parameters)){ hasMark=true; break; } } }
if(item.children().length()>0){
childReturn=doLoop(item,2);
}
if(hasMark && childReturn==""){
OutTempStr+=innerTempStr+"</"+tagName+">";
}
else if(!hasMark && childReturn==""){
innerTempStr="";
OutTempStr+="";
}else if(childReturn!="") {
OutTempStr+=innerTempStr+childReturn+"</"+tagName+">";
}
}
if(top==1&&OutTempStr!=""){
newXmlStr+=OutTempStr;
}
return OutTempStr;
}
private function getXmlNodeString(xml:XML):String{
var tagName:String=xml.localName();
var rtStr:String="<"+tagName+" ";
for(var i:int=0;i<xml.attributes().length();i++){
rtStr+=xml.attributes()[i].localName()+"='";
rtStr+=xml.attributes()[i].toString()+"' ";
}
rtStr+=">"
return rtStr;
}
private function checkTag(tagName:String,tagArray:Array):Boolean
{
var result:Boolean=false;
for each(var item:String in tagArray)
{
if(item==tagName){
result=true;
break;
}
}
return result;
}
private function validate(str:String,parameters:Array):Boolean
{
var result:Boolean=false;
for each(var item:String in parameters)
{
if(str.indexOf(item)>-1)
{
result=true;
break;
}
}
return result;
}
}
}
下面是用法:
1: var xmlSearch:XmlSearch=new XmlSearch();
2: var queryTagName:Array=["folder","file"];
3: var queryAttributes:Array=["name","id"];
4: var ss:String=xmlSearch.getXmlByLabel(treeData,queryTagName,queryAttributes,searchStr);
希望大家共同探讨更加简洁的算法。