高分提问:XML数据读取问题

xiaozaoqiu 2008-06-15 04:12:05
mxml文件:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="LoadXml() ">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.xml.XMLDocument;

private var myXML:XML;
private var mystr:String;
public function LoadXml():void
{

myXML= new XML();
var XML_URL:String = "api.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
ale();

function xmlLoaded(event:Event):void
{

myXML = XML(myLoader.data);
Alert.show(myXML.toXMLString());//取得了值
mystr=myXML.toXMLString();//全局变量mystr,但是始终无法读取到值
}

}
private function ale():void
{
Alert.show(mystr.toString());//空

}


]]>
</mx:Script>
</mx:Application>

xml文件:
[API.XML]
<?xml version='1.0' encoding='UTF-8'?>
<api>
<http_cation>http://10.10.1.71/</http_cation>
<config>http://10.10.1.71/mystore/xml/get_config.php</config>
</api>

为什么我的mystr取不到值呢?如何才能读取到本地XML文件的节点值并可以随时调用呢?????

...全文
256 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsq588888 2008-06-19
  • 打赏
  • 举报
回复
先给你总结一下你这里的几个问题:
1.myLoader是一个局部变量,在 xmlLoaded 这个方法里肯定是找不到这个变量的,所以你第一帖给的代码是肯定运行不起来的
2.你的 ale 方法是在 Event.COMPLETE 结束完成后执行才有效,因为你初使化调用,里面根本就没内容,所以会出错
3.你导入了一些不必要的类,包等,eg: import flash.events.Event; import flash.xml.XMLDocument; and so on
4.我没看懂你所想要的结果是什么,是得到字符串,还是XML?
5.xml在as的脚本和在 mxml解析的过程是一样的,都是解析出来
6.11楼说的方法在有的情况下可用,但是重新1000000000000次的话,可想而知,并且这里面不涉及到这个问题
7.其它的暂时还不知道说什么,给你留个例子吧,解析XML.就按你给出的代码里写
private var mystr:String;
private var myLoader:URLLoader;
public function LoadXml():void {
var XML_URL:String = "api.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
myLoader= new URLLoader(myXMLURL);
myLoader.addEventListener( Event.COMPLETE, xmlLoaded);
//
}
public function xmlLoaded( event:Event ):void {
var v:String = URLLoader( event.target ).data.toString();
mystr = v ;
ale();
}
private function ale():void {
Alert.show(mystr);
}
代码格式不知道这里怎么弄,就这样子了,肯定能运行通过的,至于xml的节点,你自己搞定吧
sbshu 2008-06-19
  • 打赏
  • 举报
回复
var downLoader:DownLoader=new DownLoader(WebServiceBaseUrl+"/Tree?type=0");
downLoader.Begin(完成方法(读取到的XML数据),进度方法(进度百分比),出错方法(出错类型));
sbshu 2008-06-19
  • 打赏
  • 举报
回复
上面那个是一个用urlRequest和urlStream实现在下载,希望对你有用
sbshu 2008-06-19
  • 打赏
  • 举报
回复
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.xml.XMLDocument;
import mx.controls.Alert;
public class DownLoader
{
private var urlRequest:URLRequest;
private var urlStream:URLStream;
private var FinishHandler:Function;
private var ProgressHandler:Function;
private var _Url:String;
private var ErrorHandler:Function;
public function DownLoader(url:String="")
{
Url=url;
}
public function set Url(url:String):void
{
_Url=url;
}
public function get Url():String
{
return _Url;
}
public function Begin(finishHandler:Function=null,progressHandler:Function=null,errorHandler:Function=null):void
{
FinishHandler=finishHandler;
ProgressHandler=progressHandler;
ErrorHandler=errorHandler;
urlRequest=new URLRequest();
try
{
var urlRequest:URLRequest=new URLRequest();
urlStream=new URLStream();
urlRequest.url=Url;
AddLoaderListeners(urlStream);
urlStream.load(urlRequest);
}
catch(e:Error)
{
mx.controls.Alert.okLabel="确定";
mx.controls.Alert.show("数据下载失败,请与管理员联系!\r\n详细信息:\t"+e.message,"系统提示");
}
}
//添加下载监听
private function AddLoaderListeners(dispatcher:EventDispatcher):void
{
dispatcher.addEventListener(Event.COMPLETE, dl_CompleteHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, dl_ProgressHandler);
dispatcher.addEventListener(flash.events.IOErrorEvent.IO_ERROR, dl_IOErrorHandler);
dispatcher.addEventListener(flash.events.SecurityErrorEvent.SECURITY_ERROR, dl_SecurityErrorHandler);
}
//下载完成
private function dl_CompleteHandler(event:Event):void
{
var sourceXMLString:String=urlStream.readUTFBytes(urlStream.bytesAvailable).toString();
var sourceXML:XMLDocument=new XMLDocument(sourceXMLString);
//这里的代码可以自定义,我这边是调用WebService用的
var targetXML:String=sourceXML.childNodes[1].childNodes[0].nodeValue;

if(FinishHandler!=null)
FinishHandler.call(this,targetXML);
}
//下载出错
private function dl_IOErrorHandler(event:Event):void
{
if(ErrorHandler!=null)
ErrorHandler.call(this,"io");
}
//安全问题出错
private function dl_SecurityErrorHandler(event:Event):void
{
if(ErrorHandler!=null)
ErrorHandler.call(this,"security");
}
//正在下载
private function dl_ProgressHandler(event:ProgressEvent):void
{
var parsent:Number=(event.bytesLoaded*100)/event.bytesTotal;
parsent=int(parsent);
if(ProgressHandler!=null)
ProgressHandler.call(this,parsent);
}
}
}
zhou968 2008-06-19
  • 打赏
  • 举报
回复
楼主要注意,XML最外层的节点是不能写的.
xiaozaoqiu 2008-06-18
  • 打赏
  • 举报
回复
反复调用加载方法
??
这个在程序中如何实现?〉谢谢!!
理财冰鼠 2008-06-18
  • 打赏
  • 举报
回复
如果是异步的问题,那么可以设置一个flag,反复调用加载方法
如果加载完成则设置成true.
alert的时候要去判断此值是否为true,为true才Alert
xiaozaoqiu 2008-06-18
  • 打赏
  • 举报
回复
把取出来的值放入我的全局变量
public static var xxx:string;
在其他模块,这个值还是为空。。。。。
不会飞的鱼 2008-06-17
  • 打赏
  • 举报
回复
ale();放xmlLoaded的最后一行,能取出来值
xiaozaoqiu 2008-06-16
  • 打赏
  • 举报
回复
bossma :你解决了么?
我现在想把读取本地XML文件这个方法放到我自定义的类中来实现
其他需要读取的地方直接通过类提供的方法来提取就行了,
但还是实现不了,,,数据还是为空,
ale(); 放到xmlLoaded中也不能实现。。。


现在我只能把它放在MXML中才能实现。。。。
萤火架构 2008-06-16
  • 打赏
  • 举报
回复
ale(); 放到xmlLoaded中可以吗?
萤火架构 2008-06-16
  • 打赏
  • 举报
回复
昨天也遇到这个问题
用了一个addEventListener,在后边立刻取数据为null
换一个地方就好了
xiaozaoqiu 2008-06-16
  • 打赏
  • 举报
回复
我现在就是无法得到外部数据,如何实现呢??
nkliwenjian 2008-06-16
  • 打赏
  • 举报
回复
我需要你提供你所说的修改过后的代码,看看是不是改对了
xiaozaoqiu 2008-06-16
  • 打赏
  • 举报
回复
没有人能解决么?
maninwater 2008-06-15
  • 打赏
  • 举报
回复
function xmlLoaded(event:Event):void
{

myXML = XML(myLoader.data);
mystr=myXML.toXMLString();//全局变量mystr,但是始终无法读取到值
Alert.show(mystr);//取得了值
}

这里是有值的。而
private function ale():void
{
Alert.show(mystr);//空

}
这个地方没值

之所以采用myLoader.addEventListener(Event.COMPLETE, xmlLoaded);
就是因为读取是异步的必须要有listener检测读取的进度。完成后执行xmlLoaded这个函数,所以你直接在外部调用ale();
这时xml还没有加载完成所以是空。

无论是图片还是xml,外部的数据都需要经过侦听器来完成应用操作。
xiaozaoqiu 2008-06-15
  • 打赏
  • 举报
回复
不好意思更正一下
private function ale():void
{
Alert.show(mystr.toString());//空

}
改为:
private function ale():void
{
Alert.show(mystr);//空

}

4,328

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧