Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
HaXe SAX (Simple API for XML) XML парсер.
Давно была мысль сдалать что-то подобное, и вот сейчас взялся.
Что такое 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 парсер для таких вещей, как правило очень неудобно.
Моя реализация отличается от привычных тем, что, я еще и хотел попрактиковаться в написании кастомных итераторов. Идея заключается в том, что вы можете пройтись по произвольному участку документа в обычном цикле, последовательно считывая значения узлов и как-нибудь на это реагируя. Вот простой пример использования:
/** * ... * @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
Всего комментариев 0
Комментарии
Последние записи от wvxvw
- Dired - текстовый проводник по файловой системе (29.06.2013)
- Навигация по HTML с WASD (09.06.2012)
- JavaScript, все не так плохо (07.06.2012)
- Что такое tarball и чем его пакуют (11.04.2012)
- Критика Presentation Model (18.02.2012)