AS3处理XML.docx
《AS3处理XML.docx》由会员分享,可在线阅读,更多相关《AS3处理XML.docx(10页珍藏版)》请在冰豆网上搜索。
AS3处理XML
AS3处理XML
分类:
Flex/AIR2011-07-2616:
47112人阅读评论(0)收藏举报
写的有些乱,不过这些都是最简单直接的AS操作XML的方法
初始化XML对象
XML对象可以代表一个XML元素、属性、注释、处理指令或文本元素。
在ActionScript3.0中我们可以直接将XML数据赋值给变量:
varmyXML:
XML=
burger
3.95
fries
1.45
你也可以使用new构造器来从XML数据文本创建一个XML对象实例:
varmyXML:
XML=newXML("burger3.95")
如果XML数据不是格式完好的(如少了结束标签),那么将会出现运行时错误。
注意,你也可以将变量实例传入XML数据中:
vartagname:
String="item";
varattributename:
String="id";
varattributevalue:
String=5;
varcontent:
String="Chicken";
varx:
XML=<{tagname}{attributename}={attributevalue}>{content}{tagname}>;
trace(x.toXMLString())
//Output:
Chicken
加载XML
通常,我们的应用是从外部源导入XML数据,如webservice或RSSfeed,以下是一个从远程URL导入XML数据的例子:
varmyXML:
XML=newXML();
varXML_URL:
String="
//创建URLRequest。
varmyXMLURL:
URLRequest=newURLRequest(XML_URL);
//使用URLLoader导入数据。
varmyLoader:
URLLoader=newURLLoader(myXMLURL);
//添加事件监听器,以在XML数据导入完成后处理XML数据。
myLoader.addEventListener("complete",xmlLoaded);
//导入完成后,创建使用导入的数据创建XML对象
functionxmlLoaded(evtObj:
Event){
varmyXML:
XML=XML(myLoader.data);
trace("Dataloaded.");
}
也可以直接读取本地XML
varfileStream:
FileStream=newFileStream();
fileStream.open(newFile("c:
\111.xml"),FileMode.READ);
varcontentXml:
XML=newXML(fileStream.readUTFBytes(fileStream.bytesAvailable));
fileStream.close();
使用.和@:
用于访问属性:
//获取第1个item的menuName值
trace(myXML.item[0].menuName);//Output:
burger
//获取第1个item的id属性值
trace(myXML.item[0].@id);//Output:
1
//获取id属性为2的item的menuName值
trace(myXML.item.(@id==2).menuName);//Output:
fries
//获取menuName为burger的item的price值
trace(myXML.item.(menuName=="burger").price);//Output:
3.95
你也可以使用appendChild()方法给XML添加新的子节点:
varnewItem:
XML=
mediumcola
1.25
myXML.appendChild(newItem);
当然你也可以使用@和.操作符来更新数据:
myXML.item[0].menuName="regularburger";
myXML.item[1].menuName="smallfries";
myXML.item[2].menuName="mediumcola";
myXML.item.(menuName=="regularburger").@quantity="2";
myXML.item.(menuName=="smallfries").@quantity="2";
myXML.item.(menuName=="mediumcola").@quantity="2";
访问XML数据
你可以使用.(点号)和..操作符访问XML对象的子节点,使用@操作符访问某一节点的属性。
考虑以下XML对象:
varx:
XML=
BakingExtravagantPastrieswithKumquats
Contino
Chuck
238
EmuCareandBreeding
Case
Justin
115
对象x.book表示一个包含所有名称为book的子节点的XMLList对象,该XMLList包含两个XML对象(两个book节点)。
对象x..lastName表示一个包含XML树结构下部所有的lastName属性的XMLList对象,该XMList包含两个XML对象(两个LastName属性)。
对象x.book.editor.lastName表示一个包含所有x对象的所有名称为book的子节点的所有名称为editor的子节点的所有lastName节点的XMLList对象,该XMLList只包含一个XML对象(值为"Case"的lastName属性)。
访问父节点和子节点
parent()方法返回XML对象的父节点。
你可以使用子节点列表的顺序索引值来访问特定的子节点,例如,假定某一XML对象x有两个名称为book的子节点,你可以如下访问它们:
//第1个book节点
x.book[0]
//第2个book节点
x.book[1]
要访问孙子节点,我们可以如下直接使用儿子和孙子节点的索引值来访问:
x.book[0].title[0]
不过如果x.book[0]只有一个名称为title的子节点的话,那么可以省略索引:
x.book[0].title
类似的,如果x对象只有一个book子节点,并且该book节点的子节点对象只有一个title对象,那么两个索引值都可以省略:
x.book.title
注意,你也可以使用child()方法,直接使用名称访问特定的子节点:
varx.XML=
Dictionary
varchildName:
String="book";
trace(x.child(childName).title)//Output:
Dictionary
访问属性
我们使用使用@操作符访问XMLNode属性:
varmyXML:
XML=
burger
3.95
fries
1.45
//获取第1个item的id属性值
trace(myXML.item[0].@id);//Output:
1
使用属性或元素值过滤XML数据
我们可以使用特定的元素名称和属性值来定位到特定的元素考虑以下XML对象:
varx:
XML=
Zmed
Sue
Dataanalyst
McGee
Chuck
Jr.dataanalyst
以下是正确的访问方法:
//lastName为“McGee”的employee对象,第1个employee节点
x.employee.(lastName=="McGee")//Thefirstemployeenode
//lastName为“McGee”的employee对象的firstName节点,第1个employee节点的节点
x.employee.(lastName=="McGee").firstName//ThefirstNamepropertyofthatnode
//lastName为“McGee”的id属性
x.employee.(lastName=="McGee").@id//Thevalueoftheidattribute
//所有id属性值为347的employee对象列表
x.employee.(@id==347)
//id属性值为347的employee对象的lastName子节点
x.employee.(@id==347).lastName
//所有id属性值大于347的employee对象列表
x.employee.(@id>300)//AnXMLlistwithbothemployeeproperties
//所有position子节点值包含“analyst”的employee对象列表
x.employee.(position.toString().search("analyst")>-1)
使用for...in和foreach...in语句
ActionScript3.0包括了一个新用来遍历XMLList对象的的for...in语句和foreach...in语句。
例如,考虑以下XML对象,myXML和myXML..itemXMLList对象(包含两个itemXML对象节点的XML列表):
varmyXML:
XML=
burger
3.95
fries
1.45
for...in语句可以让我们遍历XMLList的所有属性名称,实际上就是个节点的索引值:
vartotal:
Number=0;
for(varpname:
StringinmyXML..item)
{
total+=Number(myXML.item.@quantity[pname])*Number(myXML.item.price[pname]);
}
foreach...in语句遍历XMLList的所有节点:
vartotal2:
Number=0;
foreach(varitem:
XMLinmyXML..item)
{
total2+=Number(item@quantity)*Number(item.price);
}
使用with语句
我们可以使用with语句,来指明后续的属性和节点值都是基于某一XML对象,前面的foreach...in示例代码,使用with语句的代码如下:
vartotal:
Number=0;
foreach(variteminmyXML..item)
{
with(item)
{
//{内的属性和节点对象都是基于itemXML对象的,所有不需要使用item.来访问。
total+=Number(@quantity)*Number(price);
}
}
trace(total);
修改XML对象
我们可以使用prependChild()方法或者appendChild()方法在XML对象的子节点列表的前面或者最后面添加节点:
varx1:
XML=
Paragraph1
varx2:
XML=
Paragraph2
varx:
XML=
x=x.appendChild(x1);
x=x.appendChild(x2);
x=x.prependChild(
Paragraph0
);
//x==
Paragraph0
Paragraph1
Paragraph2
使用insertChildBefore()方法或者insertChildAfter()方法在特定的节点前面活着回后面添加节点:
varx:
XML=
Paragraph1
Paragraph2
varnewNode:
XML=
Paragraph1.5
x=x.insertChildAfter(x.p[0],newNode)
x=x.insertChildBefore(x.p[2],
Paragraph1.75
)
注意,我们也可以在构造XML对象的时候使用大括号({和})来引用变量:
varids:
Array=[121,122,123];
varnames:
Array=[["Murphy","Pat"],["Thibaut","Jean"],["Smith","Vijay"]]
varx:
XML=newXML("");
for(vari:
int=0;i<3;i++){
varnewnode:
XML=newXML();
newnode=
{names[i][0]}
{names[i][1]}
x=x.appendChild(newnode)
}
我们也可以使用=操作符来给XML对象节点赋值:
varx:
XML=
Smith
x.firstname="Jean";
x.@id="239";
以上代码将把XML对象X设置成如下:
Smith
Jean
我们也可以使用+和+=操作符来连结XMLList:
varx1:
XML=test1
varx2:
XML=test2
varxList:
XMLList=x1+x2;
xList+=test3
删除XML对象
E4X规范中定义有delete和deleteByIndex方法用来删除特定的XML节点,但是在当前版本的ActionScript3.0实现中,并没有实现这两个方法,所有我们不能直接使用这两个方法,不过我们可以使用遍历XML树,剔除特定的节点,重新构造新的XML对象的方法来删除某一特定节点,以下我们将删除employee的lastname子节点:
privatefunctiondeleteByIndex(xmlNode:
XML,index:
Number):
XML{
varnewStr:
String='';
newStr+='<'+xmlNode.localName();
foreach(varatt:
XMLinxmlNode.attributes()){
newStr+=''+att.localName()+'="'+att.toString()+'"';
}
newStr+='>';
vari:
Number=0;
foreach(varnode:
XMLinxmlNode.children()){
if(i!
=index)
newStr+=node.toXMLString();
i++;
}
newStr+=''+xmlNode.localName()+'/>';
returnnewXML(newStr);
}
varmyXML:
XML=
Smith
Jean
shangrao
daihu
5
myXML=deleteByIndex(myXML,0);
以上的deleteByIndex函数有两个参数,第1的参数是被删除节点的父节点,第2的参数是被删除节点的在父节点的子节点列表中索引值。
先遍历父节点的索引属性,然后遍历其所有的子节点,跳过我们要删除的节点,然后将它们组合成新的XML对象返回。
如果XML对象非常复杂,数据量必较大的话,以上删除节点的实现方法效率是非常好低,所有正确的选择还是使用E4X定义的删除方法,不过这个功能要等到ActionScript3.0的下一个测试版本才能够实现。
XML类型转换
我们可以将XML对象和XMLList对象转换为字符串,同样的,我们也可以将字符串转换为XML对象和XMLList对象。
顺便,请记住所有的XML属性值、名称和文本值都是字符串。
转换XML和XMLList对象为字符串
XML对象和XMLList对象都有有两个成员方法:
toString()和toXMLString()方法。
toXMLString()方法返回包含所有标签、属性、命名空间声明和XML对象内容的字符串,对与复杂的XML对象(包含有子元素),toString()方法的效果和toXMLString()方法的效果一样,但是对与简单的XML对象(只包含一个文本元素),toString()方法只返回元素的文本内容:
varmyXML:
XML=
burger
3.95
trace(myXML.item0.menuName.toXMLString())
//Output:
burger
trace(myXML.item0.menuName.toString())
//Output: