xml格式:
<mx:XMLList id="treeData"> <node label="1" id="1" index="1,"> <node label="1" id="101" index="2,"> <node label="1-1" id="10101" index="3,"/> <node label="1-2" id="10102" index="4,"/> <node label="1-3" id="10103" index="5,"/> </node> <node label="1" id="101" index="2,"> <node label="1-1" id="10101" index="3,"> <node label="1-2" id="10102" index="4,"/> <node label="1-3" id="10103" index="5,"/> </node> <node label="1-2" id="10102" index="4,"/> <node label="1-3" id="10103" index="5,"/> </node> </node> </mx:XMLList>
一次获取所有节点的index属性的集合:
AS代码:
var dropSourceXml:XMLList=treeData;
Alert.show("index="+dropSourceXml..node.attribute("index")); //其中node 表示xml中定义的节点的名字 index 为属性名
至于每个index后面有个“,”方便截取转换成array 比较。
<mx:XMLList id="userData"> <root> <users> <user id="1" > <firstName> firstName:admin1 </firstName> <lastName> lastName:admin1 </lastName> </user> <user id="2" > <firstName> firstName:admin2 </firstName> <lastName> lastName:admin2 </lastName> </user> </users> </root> </mx:XMLList>
1.根据索引返回指定的值
userData.users.user[1].firstName
2.根据属性的值返回制定节点的信息
userData.users.user(@id==2).firstName
3.根据邻居节点返回指定节点的值
firstName节点和lastName节点是相邻的节点
userData.users.user(@lastName=='lastName:admin2').firstName
4.访问节点属性使用@符号访问节点属性
userData.users.user(@id==2).@firstName
5.赋值
userData.users.user[1].@id=3;
userData.users.user[1].id=3;
userData.users.user(@id==2).firstName='asdfasdf';
userData.users.user(@lastName=='lastName:admin2').firstName="asdfasdfasdf"
6.判断是否存在指定的节点
userData.users.hasOwnProperty("user")
7.循环遍历节点
for each(var node:XML in userData.users.user)
{
var name=node.firstName;
}
var list:XMLList=userData.users.user;
for each(var node:XML in list)
{
var name=node.firstName;
}
8.获取后代所有节点
userData..user.firstName;返回的结果是
<firstName>firstName:admin1</firstName>
<firstName>firstName:admin2</firstName>
9.通配符使用
userData.user.user.*;返回结果
<firstName>firstName:admin1</firstName>
<lastName>lastName:admin1</lastName>
<firstName>firstName:admin2</firstName>
<lastName>lastName:admin2</lastName>
匹配所有属性userData.users.user@.*;返回结果是user节点中所有的属性值
10.添加节点
prependChild | (newChild);//在xml开始部分插入一个节点 |
appendChild(newChild);//在xml结算位置插入一个节点
11.删除节点
delete userData.users.user[1];
12.xml中使用动态变量
var userName:String = "demo";
var myXML:XML = <person><userName>{userName}</userName></person>;
13.新增一个节点元素
//例子一:
var example:XML = <person/>;
example.father = <father/>; //内容属性和元素名称不一定要相同,也可以: example.abc = <father/>,但会以元素名称为准,即会建立一个<father/>元素
trace(example);
/* 输出: <person> <father/> </person> */
//例子二:
var example:XML = <person/>;
example.father = ""; //建立一个<father/>元素
trace(example.toString());
/* 输出: <person> <father/> </person> */
//例子三:
var example:XML = <person/>;
var id:int = 10;
example["user" + id] = "";
trace(example);
/*
输出:<person> <user10/> </person>
注意: 有些情况必须使用第三种情况.例如,元素节点名称内含连字符("-")是完全合法的,但在ActionScript里会得到编译器错误: example.some-element = ""; //产生编译器错误 正确的写法是: example["some-element"] = ""; */
14.新增属性
var example:XML = <person/>;
example.element = "";
example.element.@name = "demo";
example.element.@["bad-variable-name"] = "yes";
example.element.@other = ["riahome.cn", undefined, true, 44, null];
var id:int = 44;
example.element.@["user" + id] = "love";
trace(example);
/*
输出:
<person>
<element name="demo" bad-variable-name="yes" other="riahome.cn,,true,44," user44="love"/>
</person>
*/
15.向XML插入文字元素和节点元素
//在指定元素前和后插入,在最前端和尾端插入
var example:XML = <person/>;
example.two = "";
example.insertChildBefore(example.two, <one/>); //在two节点前插入one节点
example.insertChildBefore(example.two, "在two节点前插入文字");
example.insertChildAfter(example.two, <three/>); //在two节点后插入three节点
example.prependChild(<start/>); //在最顶端插入start节点
example.appendChild(<end/>); //在尾端插入end节点
example.start = "start内容"; //向节点增加内容
trace(example);
/*
输出:
<person>
<start>start内容</start>
<one/>
在two节点前插入文字
<two/>
<three/>
<end/>
</person>
*/
16.把XML实例的内容属性转换为任何可以转换成字符串的内容
//先把等号右边转为可以转换的字符串
var example:XML = <person/>;
example.one = "one";
example.two = new URLLoader();
example.three = new Sprite();
example.four = new Boolean; //Boolean对象的值初始化为false
example.five = new Number();
example.six = new String();
example.seven = {a:"Youthoy", b:true, c:undefined};
example.eight = ["three", undefined, true, 44, null];
/*
输出:
<person>
<one>one</one>
<two>[object URLLoader]</two>
<three>[object Sprite]</three>
<four>false</four>
<five>0</five>
<six/>
<seven>[object Object]</seven>
<eight>three,,true,44,</eight>
</person>
*/
17.递归迭代XML
var example:XML = <menu>
<menuitem label="File">
<menuitem label="New"/>
<menuitem label="Save"/>
</menuitem>
<menuitem label="Help">
<menuitem label="About"/>
</menuitem>
</menu>;
walk(example);
function walk(node:XML):void {
for each(var element:XML in node.elements()) {
trace(element.@label);
walk(element);
}
18.读取文字节点及其值
var example:XML = <menu>
My name is Youthoy.
<myName>Youthoy</myName>
</menu>;
example.text(); //输出: My name is Youthoy.
example.myName.toXMLString(); //输出: <myName>Youthoy</myName>
//以下三行都输出: Youthoy
example.myName.toString();
example.myName.text();
example.myName;
19.递归元素属性时读取属性名与其值
var example:XML = <person name="Youthoy" age="21"/>;
for each(var i:XML in example.attributes()) {
trace(i.name() + "=" + i);
}
/*
输出:
name=Youthoy
age=21
*/
另类方法:
var example:XML = <person name="Youthoy" age="21"/>;
trace(example.@*[1]); //输出: 21
例子1(对于节点元素):
var example:XML = <a>
<z>I am z.</z>
<b>
<c></c>
<z>I am z.</z>
</b>
</a>;
trace(example..z.text()); //输出: I am z.I am z.
例子2(对于属性):
var example:XML = <person>
<a>
<item name="Youthoy" age="21"/>
</a>
<item name="Jimpa" age="21"/>
</person>
trace(example..@name); //输出: YouthoyJimpa
var example:XML = <foodgroup>
<fruits>
<fruit color="red">Apple</fruit>
<fruit color="orange">Orange</fruit>
<fruit color="green">Pear</fruit>
<fruit color="red">Watermelon</fruit>
</fruits>
<vegetables>
<vegetable color="red">Tomato</vegetable>
<vegetable color="brown">Potato</vegetable>
<vegetable color="green">Broccoli</vegetable>
</vegetables>
</foodgroup>;
trace(example..*.(hasOwnProperty("@color") && @color == "red"));
/*
hasOwnProperty所做的检测是确保元素具有color属性,然后,有的话,就测试color属性之值是否为red.只有当条件的计算结果为true时,该元素才会加入EX4运算式所返回的XMLList.
输出
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
<vegetable color="red">Tomato</vegetable>
var myXML: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>
通常,应用程序都会从外部源(如 Web 服务或 RSS 供给)加载 XML 数据。不过为清楚
起见,本章中的示例是将 XML 数据作为文本来分配的。
如以下代码所示,E4X 包含了一些直观运算符(如点 (.))和属性标识符 (@) 运算符,用于
访问 XML 中的属性 (property) 和属性 (attribute):
trace(myXML.item[0].menuName); // 输出:burger
trace(myXML.item.(@id==2).menuName); // 输出:fries
trace(myXML.item.(menuName=="burger").price); // 输出:3.95
使用 appendChild() 方法可为 XML 分配一个新的子节点,如下面的代码片断所示:
var newItem:XML =
<item id="3">
<menuName>medium cola</menuName>
<price>1.25</price>
</item>
myXML.appendChild(newItem);
使用 @ 和 . 运算符不仅可以读取数据,还可以分配数据,如下所示:
myXML.item[0].menuName="regular burger";
myXML.item[1].menuName="small fries";
myXML.item[2].menuName="medium cola";
myXML.item.(menuName=="regular burger").@quantity = "2";
myXML.item.(menuName=="small fries").@quantity = "2";
myXML.item.(menuName=="medium cola").@quantity = "2";
使用 for 循环可以循环访问 XML 的节点,如下所示:
var total:Number = 0;
for each (var property:XML in myXML.item)
{
var q:int = Number(property.@quantity);
var p:Number = Number(property.price);
var itemTotal:Number = q * p;
total += itemTotal;
trace(q + " " + property.menuName + " $" + itemTotal.toFixed(2))
}
trace("Total: $", total.toFixed(2));
访问属性
使用 @ 符号(属性标识符运算符)可以访问 XML 或 XMLList 对象的属性,如下面的代码
所示:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.@id); // 6401
可以一起使用 * 通配符和 @ 符号来访问 XML 或 XMLList 对象的所有属性,如下面的代码
所示:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.@*.toXMLString());
// 6401
// 233
按属性或元素值过滤
可以使用括号运算符 — ( 和) — 过滤具有特定元素名称或属性值的元素。请考虑下面的
XML 对象:
var x:XML =
<employeeList>
<employee id="347">
<lastName>Zmed</lastName>
<firstName>Sue</firstName>
<position>Data analyst</position>
</employee>
<employee id="348">
<lastName>McGee</lastName>
<firstName>Chuck</firstName>
<position>Jr. data analyst</position>
</employee>
</employeeList>
x.employee.(lastName == "McGee") — 这是第二个 employee 节点。
■ x.employee.(lastName == "McGee").firstName — 这是第二个 employee 节点的
firstName 属性。
■ x.employee.(lastName == "McGee").@id — 这是第二个 employee 节点的 id 属性的值。
■ x.employee.(@id == 347) — 第一个 employee 节点。
■ x.employee.(@id == 347).lastName — 这是第一个 employee 节点的 lastName 属性。
■ x.employee.(@id > 300) — 这是具有两个 employee 属性的 XMLList。
■ x.employee.(position.toString().search("analyst") > -1) — 这是具有两个
position 属性的 XMLList。
如果试图按照可能不存在的属性或元素过滤,Adobe Flash Player 将引发异常。例如,以下
代码的最后一行产生一个错误,因为第二个 p 元素中没有 id 属性:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(@id == '123'));
同样,以下代码的最后一行也会产生一个错误,因为第二个 p 元素没有 b 属性:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(b == 'Bob'));
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(b == 'Bob'));
为了避免这些错误,可以使用 attribute() 和 elements() 方法来识别具有匹配属性或元素
的属性,如下面的代码所示:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));
还可以使用 hasOwnProperty() 方法,如下面的代码所示:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(hasOwnProperty('@id') && @id == '123'));
trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));
使用 for..in 和 for each..in 语句
ActionScript 3.0 包含用于循环访问 XMLList 对象的 for..in 语句和 for each..in 语
句。例如,我们来看 XML 对象 myXML 和 XMLList 对象 myXML.item。XMLList 对象
myXML.item 由 XML 对象的两个 item 节点组成。
var myXML:XML =
<order>
<item id='1' quantity='2'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2' quantity='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
for..in 语句用于循环访问 XMLList 中的一组属性名称:
var total:Number = 0;
for (var pname:String in myXML.item)
{
total += myXML.item.@quantity[pname] * myXML.item.price[pname];
}
for each..in 语句用于循环访问 XMLList 中的属性:
var total2:Number = 0;
for each (var prop:XML in myXML.item)
{
total2 += prop.@quantity * prop.price;
}
//
读取外部 XML 文档
可以使用 URLLoader 类从 URL 加载 XML 数据。要在应用程序中使用以下代码,请将示
例中的 XML_URL 值替换为有效的 URL:
var myXML:XML = new XML();
var XML_URL:String = "http://www.example.com/Sample3.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);
function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
trace("Data loaded.");
}
对于特殊的xml定义,api有详细的说明