поиск

XML и пространства имен: тонкости работы

Намусорил: Алексей «Vooparker» Аникутин
В категории: ActionScript 3

Начну с обычного примера:

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")]);

Вывод: чтение документации требует максимальной внимательности и предельной концентрации.

Удачи! ;)



Kомментариев - 5 к «XML и пространства имен: тонкости работы»

Rostislav Siryk [10 октября, 2007 в 23:58]

Так точно. QName и Namespace - важные части подхода E4X.

Во взрослых XML-ях (например, GIG-данные от MapServer) без нескольких используемых вперемешку неймспейсов не обходится; поэтому я создал для себя утилитную функцию, что возвращает элементы по их нейпмпейсу, предварительно находя их через QName (сейчас проверим, как у тебя код постится ):

/**
* Helps to get the elements located in namespaces like
* @param	xmlList
* @param	nsName
* @param	nsURI
* @param	elementName
* @return List of found elements
*/
protected function getElementsByQName(xmlList:XML, nsName:String, nsURI:String, elementName:String):XMLList
{
	var elNamespace:Namespace = new Namespace(nsName, nsURI);
	var elQName:QName = new QName(elNamespace, elementName);
	return xmlList.elements(elQName) as XMLList;
}

Отличная хрень этот QName :)

Rostislav Siryk [11 октября, 2007 в 00:00]

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

Vooparker [11 октября, 2007 в 09:32]

Рост, спасибо за функцию :)
ЗЫ: Код в каментах можно и подсвечивать - <pre><code class=”actionscript”></code></pre>

Rostislav Siryk [14 октября, 2007 в 15:53]

Крута :)

zz [15 октября, 2007 в 20:04]

Кста, длиные строки ппц,
лучше скролбары в контейнере

Написать комментарий:

Bы можете использовать следующие теги для форматирования: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>



User's collector

Внимание!
Эта опция станет доступной только после того как вы авторизуетесь.


 запомнить меня 
Я новый пользователь

На правах рекламы

заказать сайт; создание веб сайта на заказ