AS3解析XML

时间:2011-11-17 00:12:50

标签: xml flash actionscript-3 xml-parsing

Hello,当我尝试使用AS3解析XML时,我的输出面板中出现错误和输出“undefined”。我想得到score1,score2的值.... 谁能告诉我我做错了什么?

感谢

科学

    ////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>

5 个答案:

答案 0 :(得分:3)

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

myXML..score1[0].toString()

修改

使用通用命名空间会导致一些问题。添加别名可以修复它,例如:

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

否则Flash期望您将使用完全限定名称来指定您尝试访问的元素:

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

答案 1 :(得分: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());

答案 2 :(得分: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()));

答案 3 :(得分: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);
    }

}

答案 4 :(得分:-1)

它更好......就像这样

在分割位置使用score,id,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]);
}