Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > e4xu

Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
Оценить эту запись

HaXe SAX (Simple API for XML) XML парсер.

Запись от wvxvw размещена 22.02.2010 в 01:39
Обновил(-а) wvxvw 22.02.2010 в 01:44

Давно была мысль сдалать что-то подобное, и вот сейчас взялся.
Что такое SAX парсер и чем он отличается от DOM парсера.
Вкратце, SAX читает документ последовательно и вызывает пользовательские функции тогда, когда он доходит до определенного элемента, в отличие от DOM парсера, который строит иерархию и соответственно позволяет обходить дочерние узлы либо рекурсивно все, либо только первых потомков выбраного узла.
Как правило DOM удобнее в работе, большинство извесных XML парсеров используют именно его, так E4X - это DOM, XMLDocument - тоже, DOMDocument (PHP), XmlDocument (C#) и естественно JavaVascript XMLDocument - все туда же.
Но есть моменты, когда SAX парсер выигрывает:
  • вам нужно прочитать XML один раз и забыть про него (особенно, если файл читается из потока, например из файловой системы или через HTTP соединение, где у вас есть жесткое ограничение буффера, и все содержимое XML туда не влезает). SAX в таком случае читает документ за один раз никогда не возвращаясь к началу, по этому он может высвобождать буффер по мере чтения.
  • вы получаете XML с возможными ошибками форматирования. Если вы используете DOM парсер, то "оправится" после ошибки вы не сможете. Это вобщем-то исключительная ситуация, скорее может встрачаться в редакторах XML, а не при чтении обычных заранее подготовленых файлов, но мало ли, всякое бывает.
  • вам нужно "вырезать" произвольный кусок XML'я, как, например, при форматировании текста HTML тегами - использовать DOM парсер для таких вещей, как правило очень неудобно.

Моя реализация отличается от привычных тем, что, я еще и хотел попрактиковаться в написании кастомных итераторов. Идея заключается в том, что вы можете пройтись по произвольному участку документа в обычном цикле, последовательно считывая значения узлов и как-нибудь на это реагируя. Вот простой пример использования:

Код AS3:
/**
 * ...
 * @author wvxvw
 */
package tests;
 
import org.flashdevelop.utils.FlashConnect;
import org.wvxvws.xml.Sax;
 
class Test 
{
 
	public function new() { }
 
	public static function main():Void
	{
		haxe.Log.trace = function(s:String, ?pi:haxe.PosInfos)
		{
			FlashConnect.trace(s);
		};
 
		var s:Sax = new Sax(
		"<shx:resources 
			version=\"9\" compress=\"false\" package=\"org.wvxvws\"
			xmlns:shx=\"http://mindless-labs.com/samhaxe\"
			xmlns:bin=\"http://mindless-labs.com/samhaxe/modules/Binary\"
			xmlns:img=\"http://mindless-labs.com/samhaxe/modules/Image\"
			xmlns:swf=\"http://mindless-labs.com/samhaxe/modules/Swf\">
 
			<shx:frame>
				<img:image 
					impor=\"C:\\www\\projects\\xmlhelpers\\haxe\\rsx\\background.jpg\" 
					clas=\"Fake\"/>
				<!--swf:swf 
					impor=\"C:\\www\\projects\\xmlhelpers\\haxe\\rsx\\preloader.swf\" 
					clas=\"Preloader\"
					/-->
			</shx:frame>
			<?foo sdlkfgj s; lfkd; asldkfj sldjkflskjkf slfjldsf3948759 30495803 ?>
			<shx:frame>
				<bin:binary 
					impor=\"C:\\www\\projects\\xmlhelpers\\haxe\\rsx\\main.swf\"
					clas=\"Application\" compress=\"false\"/>
				<!--swf:swf
					impor=\"C:\\www\\projects\\xmlhelpers\\haxe\\rsx\\main.swf\" 
					clas=\"Application\"
					/-->
			</shx:frame>
		</shx:resources>");
 
		for (i in s.iterator())
		{
			switch (i.type)
			{
				case Xml.Element: trace("Node: " + i.name);
				case Xml.Comment: trace("Comment: " + i.value);
				case Xml.Prolog: trace("PI: " + i.value);
				default: trace("default case (text | CData | Doctype)");
			}
		}
		trace(s.xml());
	}
}
Пока что можно попробовать, но код явно не оптимальный, а так же грядут доработки по более правильной валидации, возможно будет переделано сообщение об ошибках и т.п.
http://code.google.com/p/e4xu/source...vws/xml/Sax.hx
Размещено в HaXe
Комментарии 0 Отправить другу ссылку на эту запись
Всего комментариев 0

Комментарии

 

 


Часовой пояс GMT +4, время: 06:50.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.