пространство имен as3 - получить атрибут со знаком минус

Возможный дубликат:
e4x / as3: Как получить доступ к узлу с дефисом в его имени.

Я установил пространство имен для своего XML для использования SMIL, и я могу получить атрибут src элемента следующим образом:

my.node.@src, который получает "это какой-то URL"

Однако у меня есть еще один атрибут под названием «системный битрейт». Из-за знака минус я не могу сделать @system-bitrate Поэтому я попытался сделать то, что обычно делаю, а именно my.node.attribute('system-bitrate'), но это не сработало.

Как ни странно, даже my.node.attribute('src') не работает. Я подозреваю, что это связано с пространством имен? Итак, как мне получить атрибуты, используя ny.node.attribute ?

Единственное, что работает, это my.node.attributes()[1]. Я знаю, что это не "правильный путь", поэтому я надеюсь, что кто-нибудь сможет меня просветить!

К вашему сведению, я работаю с файлами SMIL.

** редактировать **

Вот пространство имен, необходимое для XML, который я использую: default xml namespace = new Namespace('http://www.w3.org/2001/SMIL20/Language');

И пример XML, с которым я работаю:

<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="title" content="Live"/>
  </head>
  <body>
    <switch>
      <video src="myStreamName" system-bitrate="200000"/>
    </switch>
  </body>
</smil>

** пример кода для DennisJaaman **

default xml namespace = new Namespace('http://www.w3.org/2001/SMIL20/Language');

var xml:XML = XML(event.target.data);
for each(var o:XML in xml.body['switch'].video) {
    if(!hs) hs = o;
    else {
        trace(o.attributes()[1]); // works
                trace(o.@url); // doesn't work either (makes me wonder about NS issues
                trace(o['@system-bitrate']); // doesn't work
                trace(o.attribute('@system-bitrate') // doesn't work
                // etc etc, I just left a few in here
    }
}

person Jacksonkr    schedule 11.07.2011    source источник


Ответы (3)


Попробуйте использовать квадратные скобки, как в примере ниже:

default xml namespace = new Namespace("http://www.w3.org/2001/SMIL20/Language");
var xmlSmpl:XML=<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
  <head>
    <meta name="title" content="Live"/>
  </head>
  <body>
    <switch>
      <video src="myStreamName" system-bitrate="200000"/>
    </switch>
  </body>
</smil>;

trace (xmlSmpl.body['switch']['video']['@system-bitrate']);
person DigitalD    schedule 11.07.2011
comment
К сожалению, вы должны использовать следующее пространство имен: default xml namespace = new Namespace('http://www.w3.org/2001/SMIL20/Language'); - person Jacksonkr; 13.07.2011
comment
Я понятия не имею, почему это сработало, но это сработало (может быть, это было все время плохо?). +1 и ответ - person Jacksonkr; 15.07.2011

Вот! Сила QName!

my.node.attribute( 
    new QName( 'http://www.w3.org/2001/SMIL20/Language', 'system-bitrate' ) 
)

Дело в атрибуте (и потомке, и потомке...) в том, что его параметр имеет тип * (анонимно). Это связано с тем, что на самом деле это не строка, а принудительное использование QName (без URI) в фоновом режиме. Это означает, что вы искали под URI по умолчанию что-то под URI выше.

Дайте мне знать, как работает этот код выше.

person cwallenpoole    schedule 13.07.2011

Посмотрите этот пост:

e4x/as3: как получить доступ к узлу с дефисом в его имени

******РЕДАКТИРОВАТЬ****:

И используйте следующую нотацию, чтобы получить XML-атрибуты, которые содержат - (дефис)

trace("Video system-bitrate: " + my.node.video["@system-bitrate"]);

Они не работают:

trace("Video system-bitrate: " + my.node.video.@["system-bitrate"]);
trace("Video system-bitrate: " + my.node.video.attribute("@system-bitrate"));

Дополнительные сведения см. в LiveDocs.

Ваше здоровье

person Dennis Jaamann    schedule 13.07.2011
comment
Они пытаются захватить узел, тогда как я могу получить узел, но не атрибут :( - person Jacksonkr; 13.07.2011
comment
Ну, это все тот же принцип, пожалуйста, проверьте мой отредактированный пост - person Dennis Jaamann; 13.07.2011
comment
Я пробовал все это, и по какой-то причине я могу получить только что-то из my.node.video.attributes()[1], что кажется мне таким странным. Я думаю, что любой из способов, которые вы перечислили, тоже сработает. Я опубликую свой код в дополнительном редактировании моего исходного вопроса. - person Jacksonkr; 13.07.2011