Начну с обычного примера:
-
package
-
{
-
public class XMLExample
-
{
-
public function XMLExample ()
-
{
-
var someXml:XML =
-
<root>
-
<item id="id" content-type="image/png">image
-
</root>;
-
}
-
}
-
}
Получить значение аттрибута id тэга item можно так:
-
trace(someXml.item.@id);
Значения аттрибута content-type содержит символ "-" поэтому мы используем такую конструкцию:
-
trace(someXml.item.@["content-type"]);
Все это хорошо до тех пор, пока в xml не появляется xmlns, из-за которого приведенный выше код перестает работать на вполне законных основаниях:
-
var someXml:XML =
-
<root xmlns="http://uri">
-
<item id="id" content-type="image/png">image</item>
-
</root>;
Обратившись к первоисточнику я узнал, что класс верхнего уровня Namespace мне поможет:
-
package
-
{
-
public class XMLExample
-
{
-
private var ns:Namespace = new Namespace("http://uri");
-
-
public function XMLExample ()
-
{
-
var someXml:XML =
-
<root xmlns="http://uri">
-
<item id="id" content-type="image/png">image</item>
-
</root>;
-
-
default xml namespace = ns;
-
-
// Вот это прекрасно работает
-
trace(someXml.item.@id);
-
-
<strong>// А вот для content-type работать отказывается
-
trace(someXml.item.@["content-type"]);
-
-
// И так тоже результат нулевой
-
trace(someXml.item.attribute("content-type"));</strong>
-
}
-
}
-
}
Хорошо, подумал я и решил проверить видны ли атрибуты в принципе:
-
var l:int = someXml.item.attributes().length();
-
for(var i:int = 0; i <l; i++)
-
trace("Attribute #" + i + ": " + someXml.item.attributes()[i].name());
Трэйсы исправно вывели:
-
Attribute #0: id
-
Attribute #1: content-type
Ага! — сказал я и решил попробывать следующую строку:
-
trace(someXml.item.@[someXml.item.attributes()[1].name()]);
И как вы наверно догадались этот трейс выводит: image/png.
Снова обращаюсь к первоисточнику в попытках узнать, что же возвращает такое name(), что это открывает мне доступ к значению необходимого аттрибута. Согласно сигнатуре и описанию данный метод возвращает самый обычный Object. Или нет? Вот цитата:
Returns
Object- qualified name is either a QName or null.
Быстренько прокручиваю к разделу See also и нахожу в нем линк на еще один класс верхнего уровня Qname (все таки asdoc классная документация), который и стал решением моей проблемы. И так внимание правильный ответ:
-
trace(someXml.item.@[new QName("", "content-type")]);
Вывод: чтение документации требует максимальной внимательности и предельной концентрации.
Удачи!



И у тебя отлично выводится код в комментах )