2011-11-17 59 views
1

你好,当我尝试和使用AS3解析XML时,我一直在输入面板中遇到错误和输出,说“未定义”。我想获得score1,score2的值.... 任何人都可以告诉我我做错了什么吗?AS3解析XML

感谢

科学

////AS3////////// 

    import flash.net.URLLoader; 
    import flash.net.URLRequest; 
    import flash.events.Event; 

    var myXML:XML; 
    var xmlLoader = new URLLoader(); 
    xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded); 
    xmlLoader.load(new URLRequest("scores.xml")); 

    function xmlLoaded(e:Event):void 
    { 
     myXML = new XML(e.target.data); 
     trace(myXML.scores1); 

    } 
    //////xml file//////////// 
    <?xml version="1.0" encoding="UTF-8"?> 
    <feed xmlns="http://www.w3.org/2005/Atom"> 
    <root> 
    <scores> 
     <id>1</id> 
     <score1>105</score1> 
     <score2>60</score2> 
     <score3>56</score3> 
     <score4>48</score4> 
     <score5>30</score5> 
    </scores> 
    </root> 
    </feed> 

回答

3

您可能会发现descendant accessor ..有用。例如:

myXML..score1[0].toString() 

编辑:

也有一些是使用导致了一些问题的通用名称空间。添加一个别名修复它,例如:

<feed xmlns:atom="http://www.w3.org/2005/Atom"> 

否则闪光灯希望您要使用完全合格的名称来指定你要访问的元素:

var qName:QName = new QName("http://www.w3.org/2005/Atom","score1"); 
trace(myXML.descendants(qName)[0].toString()); // 105 
+0

你好我在我相信之前试过这个,但是为了确保我再次运行它并得到这个错误:TypeError:Error#1010:一个术语是未定义的并且没有属性。 \t at parser_fla :: MainTimeline/xmlLoaded()[parser_fla.MainTimeline :: frame1:14] \t at flash。事件::此事件/ dispatchEventFunction() \t在flash.events::EventDispatcher/dispatchEvent() \t在flash.net::URLLoader/onComplete() – AgnosticDev

+0

@Scientific - 这可能是尝试引用没有按得分引起不存在。例如,'score6'。 – merv

+0

你好,myXML..score1 [0] .toString()看起来是正确的,为什么这会试图引用一个不存在的分数?标签在我上面的xml文件中,它只是不断抛出该错误? – AgnosticDev

2

,因为你没有在你的XML “scores1” 标签你得到了一个未定义。 试试这个:

trace(myXML.scores.id.toString()); 
trace(myXML.scores.score1.toString()); 
trace(myXML.scores.score2.toString()); 
trace(myXML.scores.score3.toString()); 
trace(myXML.scores.score4.toString()); 
trace(myXML.scores.score5.toString()); 
+0

彼得你好,谢谢你的回答,我知道我做了犯了一个错误。但是,分数不会使用您的方法以输出框中的文本形式输出。还有什么东西一定是不正确的? – AgnosticDev

0

我有一个较为详细信息here,但你基本上会抓住所有得分标记,然后将它们相加。您还必须考虑在Feed节点上定义的xmlns。

下面的代码将为score1工作scoreX:

var namespace:Namespace = new Namespace("http://www.w3.org/2005/Atom"); 

var score:XML; 
var scores:XMLList = xml..namespace::scores.*.(/^http:\/\/www.w3.org\/2005\/Atom::score/.test(name())); 

if(!scores) 
{ 
    return; 
} 

var final:Number = 0; 
for each(score in scores) 
{ 
    final += Number(score.text()); 
} 

trace(final); // 299 

你也许可以通过引用命名空间变量简化正则表达式。

祝你好运!

[编辑]

修改引用命名空间:

var regex:RegExp = new RegExp(namespace.toString().replace(/\//g, "\\/") + "::score"); 
var scores:XMLList = xml..namespace::scores.*.(regex.test(name())); 
-1

其更好呐....这样

使用分数,身份证,score1 XML标签中分裂的地方

var xml=Xml as String; 
trace(xml); 
var xmlfull=xml.split("scores").length - 1; 
trace(xmlfull); 
for (var i = 1; i <= xmlfull; i++) 
{ 
    trace(xml.split("id")[i].split("id")[0]); 
    trace(xml.split("score1")[i].split("score1")[0]); 
    trace(xml.split("score2")[i].split("score2")[0]); 
} 
0

试试这个代码:

import gs.dataTransfer.XMLParser; 

XMLParser.load("myDocument.xml", onFinish); 

function onFinish($success:Boolean, $results:Object, $xml:XML):Void 



{ //This function gets called when the XML gets parsed. 

    if ($success) { 

     trace("The first book is: "+$results.Book[0].name); 
    } 

}