Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   XML данные (http://www.flasher.ru/forum/showthread.php?t=105063)

TheStriker 06.12.2007 21:54

XML данные
 
Доброго времени суток!

Простите за возможно глупый вопрос, но -

Есть XML файл с таким содержанием:
Код:

<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
        <trackList>
                <track>
                        <title>Movie (FLV)</title>
                        <urllink>http://www.my.com</urllink>
                </track>
        </trackList>
</playlist>

Как из него вытянуть значение ИМЕННО urllink ?

я до этого не имел дела с XML и по манам что-то очень слабо понял что-либо на эту тему....

Заранее спасибо за ответы!

wvxvw 06.12.2007 22:05

nodeName == "urllink" ? (да, это он) : (нет, опять не то!).

Fernando Costa 06.12.2007 22:08

Код:

<playlist version="1" xmlns="http://xspf.org/ns/0/">
        <trackList>
                <track tittle = "Movie (FLV)" urllink = "http://www.my.com" />
        </trackList>
</playlist>


вот такая конструкция XML пограмотнее будет.:umnik2:

TheStriker 06.12.2007 22:17

Цитата:

Сообщение от wvxvw
nodeName == "urllink" ? (да, это он) : (нет, опять не то!).

Код:

var go_xml:XML = new XML();
go_xml.load("myttl.xml");

На данном этапе у меня весь XML файл должен быть в go_xml - так?

Только как мне теперь загнать значение этого nodeName в переменную?

Вот где вопрос.....

amesqit 06.12.2007 22:18

Цитата:

Как из него вытянуть значение ИМЕННО urllink ?
ИМЕННО из этого xml-файла (1.xml), ИМЕННО urllink, можно вытянуть ИМЕННО так:

Код:

var node:XML = new XML();
node.ignoreWhite = true;
node.onLoad = function() {
        var link:String = this.firstChild.firstChild.firstChild.childNodes[1].firstChild.nodeValue;
        trace(link);
};
node.load("1.xml");


TheStriker 06.12.2007 22:37

Цитата:

Сообщение от amesqit
ИМЕННО из этого xml-файла (1.xml), ИМЕННО urllink, можно вытянуть ИМЕННО так:

Хорошо. А если, предположим, файл будет выглядеть так:

Код:

<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
        <trackList>
                <track>
                                  <old>blabla</old>
                                  <new>kukuku</new>
                        <title>Movie (FLV)</title>
                        <urllink>http://www.my.com</urllink>
                </track>
        </trackList>
</playlist>

То что измениться в Вашем фрагменте кода?

Спасибо.

З.Ы. Нужно для сравнения чтобы хоть что-то понять, а не просто получить результат.

wvxvw 06.12.2007 23:28

nodeName - свойство XMLNode, если оно является определяющим в поиске, то вот вариант:
Код:

var _xml:XML = new XML("<a><b/><c/><c/><d prop='1'/><e>text</e><f><f/></f></a>");
function __getNodes(_str:String, _xml:XML):Array {
        var r_arr:Array = [];
        var i:Number = _xml.childNodes.length;
        while(i){
                i--;
                if(_xml.childNodes[i].hasChildNodes){
                        r_arr = r_arr.concat(__getNodes(_str, _xml.childNodes[i]));
                }
                if(_xml.childNodes[i].nodeName == _str){
                        trace(_str+" node found: "+_xml.childNodes[i]);
                        r_arr.push(_xml.childNodes[i]);
                }
        }
        return r_arr;
}
trace("Result Array: "+__getNodes("b",_xml)+"\r------------------------");
trace("Result Array: "+__getNodes("c",_xml)+"\r------------------------");
trace("Result Array: "+__getNodes("d",_xml)+"\r------------------------");
trace("Result Array: "+__getNodes("e",_xml)+"\r------------------------");
trace("Result Array: "+__getNodes("f",_xml)+"\r------------------------");

Результат трейса:
b node found: <b />
Result Array: <b />
------------------------
c node found: <c />
c node found: <c />
Result Array: <c />,<c />
------------------------
d node found: <d prop="1" />
Result Array: <d prop="1" />
------------------------
e node found: <e>text</e>
Result Array: <e>text</e>
------------------------
f node found: <f />
f node found: <f><f /></f>
Result Array: <f />,<f><f /></f>
------------------------

amesqit 07.12.2007 00:22

лично я посоветовал бы тчательнее изучить 2 класса XML() и XMLNode(), там много всего полезного и интересного. Одно дело пытаться разобраться в чужом коде, что зачем, а другое почитать хелп (чужой код он не всегда хороший). Для меня, например, всегда как-то удобнее было пользоваться циклами for() для обхода xml-деревьев, но это уже личные предпочтения, для меня код такой код читавбельнее, чем циклы while().

Fernando Costa 07.12.2007 13:23

Цитата:

Сообщение от TheStriker
Хорошо. А если, предположим, файл будет выглядеть так:

Код:

<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
        <trackList>
                <track>
                                  <old>blabla</old>
                                  <new>kukuku</new>
                        <title>Movie (FLV)</title>
                        <urllink>http://www.my.com</urllink>

                </track>
        </trackList>
</playlist>


вот именно для таких случаев лучше пихать эту инфу(зеленую) в атрибуты, и не будет возникать проблем при парсинге. Проверено на своем опыте

wvxvw 07.12.2007 13:40

Цитата:

for() для обхода xml-деревьев, но это уже личные предпочтения, для меня код такой код читавбельнее, чем циклы while().
В предыдущих версиях плеера while работал быстрее, сейчас не уверен.

TheStriker 13.12.2007 19:12

Спасибо всем за ответы!

Проблему то я решил, но про XML ничего так и не понял....

Я немогу понять иерархию....
Код:

<root>
      <child>Node</child>
      <child2>Node2</child>
</root>

Никак немогу понять что тут ROOTNODE, что CHILDNODE,что firstChild, что nodeValue?

udaaff 13.12.2007 20:14

-- rootNode -- корневой узел (<root>)
-- childNode -- дочерний узел (дочерние узлы <root> -- <child> и <child2>. У них соотв. дочерние узлы Node и Node2)
-- firstChild -- "первый ребенок" первый узел (В узле <root> это <child>, в узле <child> это текстовый узел Node
-- nodeValue -- значение узла (у узла Node, значение Node)

TheStriker 13.12.2007 22:27

Цитата:

Сообщение от udaaff
-- rootNode -- корневой узел (<root>)
-- childNode -- дочерний узел (дочерние узлы <root> -- <child> и <child2>. У них соотв. дочерние узлы Node и Node2)
-- firstChild -- "первый ребенок" первый узел (В узле <root> это <child>, в узле <child> это текстовый узел Node
-- nodeValue -- значение узла (у узла Node, значение Node)

А насчет обращения к ним? Я не совсем пойму....

Со строкой this.firstChild.childNode - оно выводит undefined.....

мне в предыдущих постах дали строчку

this.firstChild.firstChild.firstChild.childNodes[1].firstChild.nodeValue

Оно то сработало, но я не пойму почему..... Почему 3 firstChild,почему childNodes[1], и почему после него еще один firstChild? Что из них к какому элементу обращается?

udaaff 13.12.2007 23:19

http://www.artlebedev.ru/tools/techn...etc/flash-xml/

amesqit 13.12.2007 23:26

Код:

<?xml version="1.0" encoding="utf-8"?>
<playlist version="1" xmlns="http://xspf.org/ns/0/">
    <trackList>
          <track>
              <title>Movie (FLV)</title>
              <urllink>http://www.my.com</urllink>
          </track>
    </trackList>
</playlist>

ищем значение "urllink" с помощью
Код:

this.firstChild.firstChild.firstChild.childNodes[1].firstChild.nodeValue
Результат примерно такая структура, в плане веток (хоть это и не код, но все же):
Код:

playlist
|_trackList
....|_track
.......|_title
.......|..|_Movie (FLV)
.......|_urllink
..........|_http://www.my.com

надеюсь понятно
1) забиваем на шапку <?xml version="1.0" encoding="utf-8"?>
2) this, в данном случае это и есть все дерево, объект класса XML();
3) this.firstChild - то же самое, что и (2), но firstChild, говорит, что обращаемся к первому узлу (он тут едиственный, корневой) "playlist"
4) this.firstChild.firstChild - обращаемся к первому дочернему узлу, узла "playlist", (опять же единственному) "track"
5) this.firstChild.firstChild.firstChild - опять первый и единственный узел "track", отсюда и 3 firstChild-а :)
6) this.firstChild.firstChild.firstChild.childNodes[1] - childNodes - массив дочерних узлов, стоит "1", т.к. нужен второй эллемент (отсчет с нуля, естественно)
7)this.firstChild.firstChild.firstChild.childNodes[1].firstChild - как можно уже догадаться, узел единственный и первый, можно конечно везде firstChild заменить на childNodes[0], но нафик (достаточно веский аргумент :) )
8) this.firstChild.firstChild.firstChild.childNodes[1].firstChild.nodeValue - nodeValue- используется для получения значения узла в виде строки, лучше его использовать для получения значения текстового узла (как в данном случае), ибо в противном случае это дело возвратит "null"

надеюсь теперь понятно как работает эта строчка и что к чему обращается.
P.S.: в данном случае лучше использовать атрибуты, а не тестовые узлы, нет здесь в текстовых узлах никакого смысла.

TheStriker 15.12.2007 21:47

ВАУ!!! Даже СУПЕР ВАУ!!! Во это ИМЕННО то в чем моя тупая голова нуждалась!

Пошел я осмысливать и пробовать.

ОГРОМНОЕ СПАСИБИЩЕ amesquit !!!

etc 15.12.2007 22:19

amesqit, и так вы будете работать с каждым XML? Писать километровые обращения по нодам?

TheStriker 16.12.2007 03:29

Чувствую себя туп-тупарём.....

XML:
Код:

<image>
        <name>Image name</name>
        <xpos>X position</xpos>
        <ypos>Y position</ypos>
</image>

Flash file:
Код:

var filik:XML = new XML();
filik.ignoreWhite = true;
filik.load("file.xml");
ts = this.firstChild.childNodes[0].firstChild.nodeValue;
trace(ts);

Что не так?:wacko:

Цитата:

Сообщение от __etc
amesqit, и так вы будете работать с каждым XML? Писать километровые обращения по нодам?

Да мне б пока хоть так допереть.....

udaaff 16.12.2007 12:55

Код:

var filik:XML = new XML();
filik.ignoreWhite = true;
filik.onLoad = function(){
    ts = this.firstChild.childNodes[0].firstChild.nodeValue;
    trace(ts);
}
filik.load("file.xml");


TheStriker 16.12.2007 17:20

Цитата:

Сообщение от udaaff
Код:

var filik:XML = new XML();
filik.ignoreWhite = true;
filik.onLoad = function(){
    ts = this.firstChild.childNodes[0].firstChild.nodeValue;
    trace(ts);
}
filik.load("file.xml");


А что без onLoad оно никак не работает?

udaaff 16.12.2007 17:28

Загрузка во флеше асинхронная.

amesqit 17.12.2007 14:18

Цитата:

Сообщение от __etc
amesqit, и так вы будете работать с каждым XML? Писать километровые обращения по нодам?

Зачем же? я писал в своем первом посте на данную тему, что это обращение именно к этому узлу, подобные ситуации, где нужно достать 1 "глубокий" эллемент, мне как-то не встречались, в реальной практике... В принципе, тут можно было бы написать и рекурсивную функцию обхода дерева, но я не вижу в данном случае в ней смысла. Если вы мне подскажите более короткий способ отыскания данного узла, я буду вам крайне признателен.

wvxvw 17.12.2007 18:13

Код:

XMLNode.prototype.__resolve = function(p):Object {
        if(!isNaN(p/1)){
                return this.childNodes[p];
        } else {
                return this.attributes[p];
        }
}
var myXML:XML = new XML("<node a='0'><sub1 a='1'/><sub1 a='2'/><sub1 a='3'/><sub2 a='4'/><sub2 a='5'/></sub1><sub1 a='6'/></node>");
trace(myXML.childNodes[0].a);
trace(myXML.childNodes[0].childNodes[0].a);
trace(myXML[0][0].a);

+ можно еще придумать вариаций на тему =)


Часовой пояс GMT +4, время: 04:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.