Начну с обычного примера:
package
{
public class XMLExample
{
public function XMLExample ()
{
var someXml:XML = <root>
<item id="id" content-type="image/png">image</item>
</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);
// А вот для content-type работать отказывается
trace(someXml.item.@["content-type"]);
// И так тоже результат нулевой
trace(someXml.item.attribute("content-type"));
}
}
}
Хорошо, подумал я и решил проверить видны ли атрибуты в принципе:
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")]);
Вывод: чтение документации требует максимальной внимательности и предельной концентрации.
Удачи! ![]()
Так точно. QName и Namespace - важные части подхода E4X.
Во взрослых XML-ях (например, GIG-данные от MapServer) без нескольких используемых вперемешку неймспейсов не обходится; поэтому я создал для себя утилитную функцию, что возвращает элементы по их нейпмпейсу, предварительно находя их через QName (сейчас проверим, как у тебя код постится ):
Отличная хрень этот QName