Форум » [x]Harbour » чтение из бооольшого XML » Ответить

чтение из бооольшого XML

gustow: Вот понадобилось читать из XML и данные писать в базу (в общем, неважно, что делать: главное - прочитать из XML нечто). Вроде бы проблем быть не должно (раньше дела не имел; глянул в XMLDEMO - все как бы просто) - но XML шибко длинный (данные по рецептам; формируется "чужой" программой; сейчас имеем 23Мб, а может быть и до 100 и до бог его знает сколько - нарастающей кучей)... И тут получается, что "обычный" путь типа [pre2] #include "minigui.ch" #include "i_xml.ch" .... // основа - из Advanced \ XMLDEMO (поменял на Public) Public oXmlDoc, oXmlNode, cFile cFile := "03170003_0_PHARMACY_REESTR_MAPLGT.xml" cFile := CurDrive() + ':\' + Curdir() + '\' + cFile oXmlDoc := HXMLDoc():Read( cFile ) // для теста ищем <TITLE>...</TITLE> - он точно есть oXMLNode := oXMLDoc:Find("TITLE") // тэг в самом начале XML (заголовок) // если нашли - должен быть "O" MsgInfo( 'ValType(oXMLNode)="' + ValType(oXMLNode) + '"' )[/pre2] приводит сначала к бооольшой паузе (30-40 сек; видимо, читает XML-файл в Read()), а затем выдает ValType() как "U" (т.е. не обнаружил его) (если урезаю XML до 20-30 Кб - находит; т.е. получается как с ограничением длины строки - не длиннее 64 Кб). Компилировал (Win98 SE; HMG 1.6.63) как: [pre2]call c:\MiniGUI\batch\compile.bat Demo /l hbxml[/pre2] (аналогично SAMPLES\Advanced\XMLDEMO). И как быть? Кто поделится опытом борьбы с XML-ками "особо больших" размеров (особенно чтения из них)? Пока что есть только мысль - читать (как обычно из файла прямого доступа) постепенно через буфер (FRead()), там вылавливать через at() начало и конец нода, а уж потом разгребать его... Чё-т как-т... :/ В Applications\MODEST применяется другая библиотека для работы с XML (xhb) - дает аналогичный результат (заменив Find() на FindFirst() и заменив HXMLDoc() на XMLDocument()).

Ответов - 6

Петр: Попробуйте использовать MSXML4 (а лучше MSXML6) Загрузите и установите с сайта MS последнюю версию MSXML (около 1,5 Mb), MSXML_SDK ( 4 Mb, документацию читать же нужно ). Маленький пример [pre2] /** */ #include "common.ch" PROCEDURE main() LOCAL xmlDoc, nodeBook, nodeId // xmlDoc := CreateObject( "Msxml2.DOMDocument.4.0" ) xmlDoc:async := FALSE xmlDoc:load( XML_PATH + "catalog.xml" ) nodeBook := xmlDoc:selectSingleNode("//book") nodeId := nodeBook:attributes:getNamedItem( "id" ) MsgInfo( nodeId:value ) // RETURN [/pre2] catalog.xml [pre2] <?xml version="1.0"?> <catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> <book id="bk102"> <author>Ralls, Kim</author> <title>Midnight Rain</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2000-12-16</publish_date> <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description> </book> <book id="bk103"> <author>Corets, Eva</author> <title>Maeve Ascendant</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2000-11-17</publish_date> <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description> </book> <book id="bk104"> <author>Corets, Eva</author> <title>Oberon's Legacy</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2001-03-10</publish_date> <description>In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant.</description> </book> <book id="bk105"> <author>Corets, Eva</author> <title>The Sundered Grail</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2001-09-10</publish_date> <description>The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon's Legacy.</description> </book> <book id="bk106"> <author>Randall, Cynthia</author> <title>Lover Birds</title> <genre>Romance</genre> <price>4.95</price> <publish_date>2000-09-02</publish_date> <description>When Carla meets Paul at an ornithology conference, tempers fly as feathers get ruffled.</description> </book> <book id="bk107"> <author>Thurman, Paula</author> <title>Splish Splash</title> <genre>Romance</genre> <price>4.95</price> <publish_date>2000-11-02</publish_date> <description>A deep sea diver finds true love twenty thousand leagues beneath the sea.</description> </book> <book id="bk108"> <author>Knorr, Stefan</author> <title>Creepy Crawlies</title> <genre>Horror</genre> <price>4.95</price> <publish_date>2000-12-06</publish_date> <description>An anthology of horror stories about roaches, centipedes, scorpions and other insects.</description> </book> <book id="bk109"> <author>Kress, Peter</author> <title>Paradox Lost</title> <genre>Science Fiction</genre> <price>6.95</price> <publish_date>2000-11-02</publish_date> <description>After an inadvertant trip through a Heisenberg Uncertainty Device, James Salway discovers the problems of being quantum.</description> </book> <book id="bk110"> <author>O'Brien, Tim</author> <title>Microsoft .NET: The Programming Bible</title> <genre>Computer</genre> <price>36.95</price> <publish_date>2000-12-09</publish_date> <description>Microsoft's .NET initiative is explored in detail in this deep programmer's reference.</description> </book> <book id="bk111"> <author>O'Brien, Tim</author> <title>MSXML3: A Comprehensive Guide</title> <genre>Computer</genre> <price>36.95</price> <publish_date>2000-12-01</publish_date> <description>The Microsoft MSXML3 parser is covered in detail, with attention to XML DOM interfaces, XSLT processing, SAX and more.</description> </book> <book id="bk112"> <author>Galos, Mike</author> <title>Visual Studio 7: A Comprehensive Guide</title> <genre>Computer</genre> <price>49.95</price> <publish_date>2001-04-16</publish_date> <description>Microsoft Visual Studio 7 is explored in depth, looking at how Visual Basic, Visual C++, C#, and ASP+ are integrated into a comprehensive development environment.</description> </book> </catalog> [/pre2] еще один пример [pre2] /** */ #include "common.ch" PROCEDURE main() LOCAL xmlDoc, objNodeList, i, cAuth := "" // xmlDoc := CreateObject( "Msxml2.DOMDocument.4.0" ) xmlDoc:async := FALSE xmlDoc:load( XML_PATH + "catalog.xml" ) objNodeList := xmlDoc:getElementsByTagName( "author" ) FOR i := 0 TO objNodeList:length - 1 cAuth += objNodeList:item(i):text cAuth += hb_osNewLine() NEXT MsgInfo( cAuth ) // RETURN [/pre2]

gustow: Спасибо, Петр! Загружу, буду просвещаться :) Т.е. (как я понял) при использовании MSXML (кстати, у "клиента" - кто будет программу использовать - тоже должно быть установлено? или только у разработчика [у меня]?) нет проблемы с загрузкой "большого" XML-файла по [pre2]xmlDoc:load( XML_PATH + "catalog.xml" )[/pre2] Я правильно понял?

Петр: Да, MSXML должен быть установлен и у пользователя (не SDK конечно). Де факто на Win2000 и выше он и так установлен. Только все равно MS рекомендует установить последнюю версию. И самому спокойнее будет :). В принципе проблем быть не должно. К тому же MSXML имеет столько возможностей, честно и сам в деталях не разобрался, что и зачем, но довольно удобно в пользовании. Правда только для Win. Если нужна кросплатформенность - изучайте libxml2, пишите функции-обертки для Harbour. Тоже мощная штука.


gustow: Петр, спасибо еще раз - попробовал MSXML (у меня в Win98SE стоит 4.2) на ваших примерах, срабатывает "мухой". Действительно, мощная штука Думаю, что не только мне поможет... В связи с этим пара-тройка вопросов: 1. В общем-то сам SDK целиком, как кажется, мне (пока) не особенно необходим (и на MS-сайте почему-то доступна только англ. версия; или я чего-то не понял?); нужен собственно Help по свойствам, функциям и пр. (отдельный от всего SDK). Где взять возможно? (желательно бы русский, но если нет - то и engl. сойдет) 2. Насчет "libxml2" - эта библиотека только для Linux? (т.к. хотелось бы иметь _одинаковые_ [по возможности] исходники - для [если нужно будет] "маневра"). 3. Или еще какое решение можете предложить? (для "кроссплатформенного" подхода) (спустя 15 мин.) Прощенья просим :) - вопрос (2) снимается: библиотека существует для многих ОС, в т.ч. и для Linux, и для Win (бинарники доступны, но работа на версиях _до_ Win2000 не гарантирована; исходники доступны также). Кого заинтересовало - тем сюда: http://citkit.ru/package/libxml/

Петр: gustow пишет: Где взять возможно? Не совсем вопрос понял - после инсталяции SDK у меня лежит в C:\Program Files\MSXML 6.0\Docs\xmlsdk6.chm MSXML->DOM Reference->DOM Methods MSXML->DOM Reference->DOM Properties и т.п. тоже самое SAX2 3. Меня и эти решения устраивают. Если по своим возможностям "монстрообразные" MSXML и libxml2 вам не подходят, а это де факто стандарт для обработки XML то не знаю.., скорее всего придется писать самому Шутка. Это слишком общий вопрос, на который можете найти ответ только вы.

gustow: Петр пишет: Не совсем вопрос понял Вопрос снят: просто думал, что сначала отдельно Help содрать/поизучать (просто доступ в Интернет бывает в основном "либо медленно, либо дорого, либо лимит кончился"). Скачал и MSXML, и LIBXML - буду определяться :) Спасибо большое за помощь!



полная версия страницы