Двоеточие в названии XML тега

1,546 views
Skip to first unread message

Warhol

unread,
Feb 16, 2010, 5:21:28 PM2/16/10
to ruFlash
Здравствуйте!
Столкнулся с неожиданной проблемой:
В rss фаиле Flickr`a некоторые xml теги называются через двоеточие.
Например:
<media:description type="html">&lt;p&gt;Купили билеты в Калининград!
&lt;/p&gt;</media:description>

При обращении к нему:
trace (bigXML.channel.item[0].media:description);
появляется ошибка:
1084: Syntax error: expecting rightparen before colon.

Valsin

unread,
Feb 16, 2010, 6:32:17 PM2/16/10
to ruFlash
При обращении к узлам-детям, нельзя использовать двоеточие.

В таком случае, думаю, нужно обращаться через метод cildren() класса
XML и XMLList.
Запись обращения:
bigXML.channel.item[0].children()[1] //обращаемся ко второму узлу-
ребенку первого элемента item. Можно и другими методами - child(),
elements(), parent(), т.е. обращение по позиции.

Вообще расширение E4X Вас разбалывало :) ...

Олег Галабурда

unread,
Feb 16, 2010, 6:45:43 PM2/16/10
to ruf...@googlegroups.com
Здрасте!

Это двоеточие в XML разделяет префикс пространства имён от локального
имени узла.
В ActionScript разделителем является двойное двоеточие :)
Далее можно либо использовать объект конкретного пространства имён

var ns:Namespace = new Namespace("идентификатор пространства имён");
trace (bigXML.channel.item[0].ns::description);

или сказать, что вам всё равно какое у узла пространство имён:

trace (bigXML.channel.item[0].*::description);

во втором случае вернёт все узлы description, не зависимо от "додвоеточия". :)

> При обращении к нему:
> trace (bigXML.channel.item[0].media:description);
> появляется ошибка:
> 1084: Syntax error: expecting rightparen before colon.


--
Oleg Galaburda
http://blog.actualwave.com/
http://jsinterface.googlecode.com/
http://guibuilder.org/

Valsin

unread,
Feb 16, 2010, 7:20:12 PM2/16/10
to ruFlash

> var ns:Namespace = new Namespace("идентификатор пространства имён");
> trace (bigXML.channel.item[0].ns::description);

В случае Warhol идентификатор пространства имен сразу задан.

var ns:Namespace = new Namespace("media");


trace (bigXML.channel.item[0].ns::description);

А в целом - поддерживаю!

Олег Галабурда

unread,
Feb 16, 2010, 7:53:01 PM2/16/10
to ruf...@googlegroups.com
Не понял, к чему это:

> В  случае Warhol идентификатор пространства имен сразу задан.

Но это работать не будет:


> var ns:Namespace = new Namespace("media");
> trace (bigXML.channel.item[0].ns::description);

идентификатор пространства имён и его префикс -- разные вещи.

var xml:XML = <root
xmlns:media="urn:uri"><media:description>Description!</media:description></root>;
var ns1:Namespace = new Namespace("media");
var ns2:Namespace = new Namespace("urn:uri");
trace(xml.ns1::description.length()); // 0
trace(xml.ns2::description.length()); // 1
trace(xml.ns2::description.toXMLString()); // <media:description
xmlns:media="urn:uri">Description!</media:description>

Яски

unread,
Feb 17, 2010, 12:15:42 PM2/17/10
to ruFlash
Еще можно сильно упростить себе жизнь написав вначале класса или
метода use namespace или в методе default xml namespace = namespace

Олег Галабурда

unread,
Feb 17, 2010, 1:04:16 PM2/17/10
to ruf...@googlegroups.com
> Еще можно сильно упростить себе жизнь написав вначале класса или
> метода use namespace или в методе default xml namespace = namespace

Никогда не выставлял пространство имён по-умолчанию для XML, с тех пор,
как напоролись на баг, с тем, что XML не хотел парсить загруженный документ.

В общем-то и до этого не использовал. :)

Яски

unread,
Feb 18, 2010, 12:16:42 PM2/18/10
to ruFlash
Пространство имен по умолчанию тоже никогда не использовал, но вот use
namespace использую, по идее с ним проблем быть не должно -- это часть
языка, а не расширение для иксэмэля.

Warhol

unread,
Feb 20, 2010, 12:56:30 PM2/20/10
to ruFlash
Большое всем спасибо!
Проблема решена!
Reply all
Reply to author
Forward
0 new messages