AS3 парсинг XML - PullRequest
       37

AS3 парсинг XML

1 голос
/ 17 ноября 2011

Здравствуйте, я продолжаю сталкиваться с ошибками и выводами, которые говорят "undefined" в моей панели вывода, когда я пытаюсь проанализировать XML с помощью AS3. Я хотел бы получить значения 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 ]

3 голосов
/ 17 ноября 2011

Возможно, вам понадобится дочерний метод доступа. . Пример:

myXML..score1[0].toString()

Edit:

Есть что-то в использовании общего пространства имен, которое вызывает некоторые проблемы. Добавление псевдонима исправляет это, например:

<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
2 голосов
/ 17 ноября 2011

Вы получаете неопределенное значение, потому что у вас нет тега "Scores1" в вашем XML. Попробуйте это:

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 голосов
/ 10 января 2013

Попробуйте этот код:

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);
    }

}

0 голосов
/ 10 января 2013

лучше на .... как это

использовать xml-тег Score, ID, Score1 в нескольких местах

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 голосов
/ 17 ноября 2011

У меня есть несколько более глубокий пост здесь , но вы, по сути, взяли бы все теги очков, а затем суммировали их. Вы также должны принять во внимание xmlns, определенный на узле канала.

Следующий код будет работать для Score1 to 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()));
...