flex xml 操作

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>

 

参考连接:http://stackoverflow.com/questions/2225864/how-to-find-specific-xml-data-by-attribute-name-value-in-flex-actionscript

 

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有详细的说明


flex xml 操作_第1张图片
 

你可能感兴趣的:(xml,Flex,actionscript)