简述在FLASH读取XML的数据(转)

本文介绍如何在Flash中使用XML接口获取外部数据,并提供一个具体的示例,展示如何解析XML文档并提取所需信息。

在FLASH中,使用XML接口获取外部数据是最有效的方法之一.(通常还有WebSerivce接口和LoadVars方法)

下面来看一个简单的XML文档(city.xml)

这个文档描述的是城市地区的信息

<?xml version="1.0" encoding="gb2312"?>

<root>

<city pnum="500000" code="021" />

<city pnum="600000" code="010" />

<city pnum="1000000" code="057" />

</root>

简单介绍一下XML文档格式的书写规范:

第一行:

这是一个XML文档的描述信息.其中定义了该XML文档的一些基本属性,包括:版本信息(version),使用的字符编码(encoding).

第二行:

(虽然在FLASH中我们用不到节点的任何属性,但是合式的XML文档必须要求一个根节点)

在XML文档中,这是一个根节点.XML规定所有标签必须有闭合.所以,在最后一行使用对应的标签来闭合.同样,单行的XML节点也需要闭合,例如:其中"/"符号就表示单行的节点闭合."name","code","pnum"是节点的属性,写法就是:属性名="属性值" 这样的名/值对.至于节点名和属性名都是可以自定义的,也就是说可以任意命名.但是还是建议要尽量规范

"city"节点是root""的子节点,相应的"root"叫做"city"的父节点

在这个XML文档中有3个子节点,我们数据就存储在这3个子节点的属性中,分别有:城市名称(name),城市代码(code),城市人口数目(pnum)

我们要做的最终目的就是在FLASH中获取这些节点的属性值

下面来看一个FLASH调用XML的实例

System.useCodepage = true;

var doc:XML = new XML();

doc.load("city.xml");

doc.ignoreWhite = true;

doc.onLoad = function(success){

if(success){

trace(doc.childNodes[0].childNodes[0].attributes.name);

trace(doc.childNodes[0].childNodes[1].attributes.name);

trace(doc.childNodes[0].childNodes[2].attributes.name);

}

}

分析:

System.useCodepage = true;

如果在XML文档中使用了中文编码,例如"gb2312".那么在FLASH中必须启用使用页面编码的指令.

var doc:XML = new XML();

建立一个XML实例.赋予"doc"这个对象.

doc.load("city.xml");

"load()"-XML对象的一个方法:加载XML数据到"doc"这个对象当中.

提供XML数据的方式并不是限制于.xml的文件,任何符合XML书写格式的文档都可以,通常,我们是使用程序来提供XML数据的,例如"http://www.51ww.com/city.aspx?country=china"

doc.ignoreWhite = true;

"ignoreWhite"-XML对象的一个属性:指定XML文档忽略空白,因为在XML中一个换行在FLASH中会被视为一个节点

doc.onLoad = function(success){}

"onLoad"-XML对象的一个方法.将会返回一个布尔值"true或false".用来判断XML是否被成功加载.如果加载成功则会返回"true",反之则返回"false"

此处为该方法使用了一个函数,其参数"success"用来贮存上述的布尔值

if(success){}

一个判断语句:如果加载成功(即success的值为"true"),则触发括号内的动作

trace(doc.childNodes[0].childNodes[0].attributes.name);

输出doc(此时"city.xml"中的数据已经包含到doc这个XML对象当中)这个XML对象的第一个节点下的第一个子节点的"name"属性值

childNodes-XML对象的一个属性,它的值的类型是数组型.XML的一个节点可以在FLASH中通过这个属性来表示其包含的数据.

由于FLASH中数组的长度计算是由"0"开始,所以我们XML文档中的第一个节点就存储在数组的"0"位置.而不是"1"

所以,我们取出XML文档的第一个节点-"",就应该表示成这样"childNodes[0]"

同样,我们取出XML对象根节点("")下的第一个子节点(""),就表示成doc.childNodes[0].childNodes[0]

相应的,取出第二个子节点:doc.childNodes[0].childNodes[1]

第三个子节点:doc.childNodes[0].childNodes[2]

(这一步中,需要涉及到FLASH中数组对象的使用原理)

在FLASH与XML的数据交互中,可能数据的表现是最难的一步.

针对上面数据表现方式,我们可以充分利用数组的便利性来做

假如已经获得一个XML对象"doc"

首先,我们将这个XML中使用到的数据转换为一个数组对象来表示

var myList:Array = doc.childNodes[0].childNodes;//直接将XML文档根节点下的的所有子节点放到一个数组中

trace(myList[0].attributes.name+","+myList[0].attributes.code+","+myList[0].attributes.pnum);//输出第一个"city"节点所有的属性值

trace(myList[1].attributes.name+","+myList[1].attributes.code+","+myList[1].attributes.pnum);//输出第二个"city"节点所有的属性值

trace(myList[2].attributes.name+","+myList[2].attributes.code+","+myList[2].attributes.pnum);//输出第三个"city"节点所有的属性值

输出结果:

上海,021,500000

北京,010,600000

浙江,057,1000000

/*以上完整的代码为*/

System.useCodepage = true;

var doc:XML = new XML();

doc.load("city.xml");

doc.ignoreWhite = true;

doc.onLoad = function(success){

if(success){

var myList:Array = doc.childNodes[0].childNodes;

trace(myList[0].attributes.name+","+myList[0].attributes.code+","+myList[0].attributes.pnum);

trace(myList[1].attributes.name+","+myList[1].attributes.code+","+myList[1].attributes.pnum);

trace(myList[2].attributes.name+","+myList[2].attributes.code+","+myList[2].attributes.pnum);

}

}

/*代码结束*/

为了在FLASH中其他的位置都能够访问到我们所需要的XML数据,我们可以将myList数组对象放置到上下文的任意位置

例如:

System.useCodepage = true;

var doc:XML = new XML();

var myList:Array = new Array();//预先建立一个数组对象用来放置XML节点数据,以便FLASH其他位置的代码都能够访问

doc.load("city.xml");

doc.ignoreWhite = true;

doc.onLoad = function(success){

if(success){

myList = doc.childNodes[0].childNodes;//当XML加载成功后对上文的myList数组对象进行赋值.

}

}

//使用一个按钮动作来获取数组对象中的一个CITY节点信息

btName.onPress = function(){

trace(_root.myList[0].attributes.name+","+_root.myList[0].attributes.code+","+_root.myList[0].attributes.pnum);

}

这样的写法当然还不满足我们一些复杂的需求,而且代码过冗长.

使用函数来返回我们需要的信息,应该是最正确的做法,我们来实现它

按下按钮时,向函数递交一个城市代码,返回城市名和人口信息

System.useCodepage = true;

var doc:XML = new XML();

var myList:Array = new Array();//预先建立一个数组对象用来放置XML节点数据,以便FLASH其他位置的代码都能够访问

doc.load("city.xml");

doc.ignoreWhite = true;

doc.onLoad = function(success){

if(success){

myList = doc.childNodes[0].childNodes;//当XML加载成功后对上文的myList数组对象进行赋值.

}

}

//函数开始

function getCityInfo(code){ //构建一个函数的写法是:function 函数名(参数){//脚本代码}

var cityName:String;//建立一个字符窜变量来存储城市名

var pepCount:String;//建立一个字符窜变量来存储居民数量

for(var i=0;i if(code eq myList[i].attributes.code){

cityName = myList[i].attributes.name;

pepCount = myList[i].attributes.pnum;

}

}

return "城市:"+cityName+",人口:"+pepCount //返回一段文字表达信息

}

//函数结束

/*按钮的动作*/

btName.onPress = function(){

trace(getCityInfo("010"));//输出函数的返回结果,(在函数的参数中提交城市代码-"010")

}

<think> 首先,用户查询是:“我想查找Matlab读取xml文件数据的方法 请问Matlab读取xml文件数据的方法”。这表明用户在寻求如何使用MATLAB读取XML文件数据的指导。 回顾系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 此外,用户提到了站内引用: - 引用[1]:描述了使用xmlread读取XML文件,并保存为.mat文件。 - 引用[2]:另一个读取XML文件的例子。 - 引用[3]:读取XML并写入struct的例子。 - 引用[4]:替换XML节点内容的例子。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 查看历史,用户上一次的问题是相同的:“我想查找Matlab读取xml文件数据的方法...”,而我的上一次回答是针对这个的。 在历史中: - 用户消息:参考站内引用:... - 我的回应:应该是一个回答。 但在当前上下文中,我需要基于这个构建回答。用户重申了需求,所以我需要提供一个清晰的、结构化的回答。 关键点: - 使用xmlread函数读取XML文件。 - 解释如何从XML节点提取数据。 - 示例代码基于引用。 结构化回答: 1. **介绍方法**:简述MATLAB读取XML文件的基本方法是使用内置函数xmlread。 2. **详细步骤**:用代码示例说明如何处理XML结构。 3. **代码示例**:基于引用[1]或[3]提供简单示例。 4. **引用标识**:在相关部分添加[^1]等。 5. **生成相关问题**:在回答结束时生成相关问题。 确保使用中文回答。 大纲回答: - 开头:MATLAB提供了xmlread函数来读取XML文件数据。 - 步骤: - 使用xmlread读取XML文件。 - 获取所需节点。 - 提取文本内容或属性。 - 处理数据(如换为数值)。 - 示例:给出一个简单例子,基于引用[1]或[3]。 - 结束:总结方法。 - 相关问题:生成3-4个相关问题。 示例代码要正确格式化。在Markdown中,使用代码块。 引用标识: - 例如,当提到xmlread时,加[^1],因为引用[1]提到它。 - 自然地添加在相关句子末尾。 相关问题: - 类似示例中的结构。 - 例如: 1. 如何处理XML文件中的属性? 2. 如何将XML数据保存到MAT文件? 3. 如何读取嵌套的XML结构? 最终回答应结构清晰。 </think> ### MATLAB读取XML文件数据的方法 MATLAB提供了内置函数 `xmlread` 来读取和处理XML文件数据。该方法基于DOM(Document Object Model)解析,允许您访问XML文档的节点、属性和内容。以下是详细步骤和代码示例,基于用户提供的引用内容[^1][^2][^3]。 #### 步骤说明 1. **读取XML文件**:使用 `xmlread` 函数加载XML文件,获取DOM文档对象。 2. **获取节点**:通过标签名(如 `'slope_x'` 或 `'student'`)定位特定节点。 3. **提取数据**:从节点中获取文本内容或属性值,并使用MATLAB函数(如 `str2double` 或 `sscanf`)换为数值或数组。 4. **处理数据**:根据需要重塑数据格式(如使用 `reshape`)。 5. **存储数据**:将提取的数据保存到变量或文件中(如 `.mat` 文件)。 #### 代码示例 以下是一个简单示例,演示如何读取XML文件并提取数据(基于引用[1]和[3]的简化版本)。假设XML文件 `example.xml` 包含如下结构: ```xml <root> <slope_x> <rows>2</rows> <cols>3</cols> <data>1.0 2.0 3.0 4.0 5.0 6.0</data> </slope_x> </root> ``` MATLAB代码: ```matlab % 1. 读取XML文件 doc = xmlread('example.xml'); % 使用xmlread函数加载文档[^1] % 2. 获取指定节点 slope_x_nodes = doc.getElementsByTagName('slope_x'); % 定位slope_x节点[^1] % 3. 提取rows和cols的值 rows_node = slope_x_nodes.item(0).getElementsByTagName('rows').item(0); cols_node = slope_x_nodes.item(0).getElementsByTagName('cols').item(0); rows = str2double(rows_node.getTextContent()); % 文本数值 cols = str2double(cols_node.getTextContent()); % 4. 提取data节点内容并重塑为矩阵 data_node = slope_x_nodes.item(0).getElementsByTagName('data').item(0); data_str = char(data_node.getTextContent()); % 获取文本字符串 data_arr = sscanf(data_str, '%e'); % 解析为数组 slope_x = reshape(data_arr, [cols, rows])'; % 重塑为矩阵(行列置) % 5. 显示或存储数据 disp('提取的slope_x数据:'); disp(slope_x); % 可选:保存到.mat文件 save('slope_data.mat', 'slope_x'); % 保存数据[^1] ``` #### 关键注意事项 - **节点索引**:MATLAB的XML节点索引从0开始(基于Java DOM)。使用 `item(0)` 获取第一个节点。 - **数据处理**:XML文本内容通常是字符串,需要使用 `str2double` 或 `sscanf` 换为数值。对于嵌套结构,递归遍历节点(引用[3]演示了读取学生数据到struct)。 - **属性提取**:如果要访问节点属性,使用 `getAttributes` 方法(如引用[4]所示)。 - **错误处理**:添加 `try-catch` 块来处理文件缺失或格式错误。 - **效率**:对于大型XML文件,考虑使用 `xmlread` 替代方案(如 `xml2struct` 第三方工具),以简化数据提取[^2][^3]。 此方法广泛用于科学数据导入、配置文件读取等场景[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值