Форум » [x]Harbour » Снова XML » Ответить

Снова XML

Dima: Нужно создавать / читать XML в UTF-16 Что есть в этом плане в Harbour ? Минимум нужно корректное чтение !

Ответов - 61, стр: 1 2 3 4 All

PSP: Щас посмотрел на метод find(). По-моему, что-то там не так с логикой сканирования массива ::aItems. При первом же несовпадении цикл завершается и никакого find не получается) Или я не туда смотрю?))

SergKis: PSP пишет По-моему, что-то там не так с логикой сканирования массива ::aItems. там все норма. Надо сначала получать "DATA" в него вложены другие тэги, т.е. o := oXml:Find("DATA", 1) o := o:Find("CONSTANTS", 1) ... т.е. For i := 1 To len(oXml:aItems) o := oXml:aItems[ i ] ? o:ClassName, o:title Next o := oXml:Find("DATA", 1) For i := 1 To len(o) o2 := o:aItems[ i ] ? o2:ClassName, o2:title Next

SergKis: PS так надо For i := 1 To len(o:aItems)


PSP: SergKis пишет: Надо сначала получать "DATA" в него вложены другие тэги Ну да, как-то так...))

Dima: SergKis Да заработало , спасибо Но дальше у меня снова затык [pre2] oXml := HXMLDoc():Read( hb_DirBase()+"test.xml" ) o:=oXml:find("DATA",1) o:=o:find("CONSTANTS",1) o:=o:find("ELEMENTS") For i := 1 To len(o:aitems) j := o:aItems[ i ] ? j:ClassName, j:title // HXMLNODE ITEM Next [/pre2] Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ? И еще вопрос , слышал что XML не любит какие то символы. Какие и на что их менять ?

PSP: Dima пишет: Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ? Они находятся в массиве aAttr, т.е. в примере это будет o:aAttr

Dima: Да я уже понял , опередил. Я так понимаю это не HASH массив и поэтому юзать надо цифры и что типа такого не прокатит j:aattr["GUID"]

PSP: Да, обычный массив

Dima: PSP пишет: Да, обычный массив Печаль , с HASH было бы веселее.

SergKis: Dima ишет поэтому юзать надо цифры чем не устраивает [pre2] METHOD GetAttribute( cName, cType, xDefault ) CLASS HXMLNode Local i := Ascan( ::aAttr,{|a|a[1]==cName} ) IF i != 0 IF cType == Nil .OR. cType == "C" Return ::aAttr[ i,2 ] ELSEIF cType == "N" Return Val( ::aAttr[ i,2 ] ) ELSEIF cType == "L" Return ( Lower( ::aAttr[ i,2 ] ) $ ".t.;on;yes;true" ) ENDIF ENDIF Return xDefault [/pre2] ?

Dima: SergKis пишет: чем не устраивает Да устраивает Не подумал сразу об этом методе............жара..

Dima: Что то меня запарило писать o:=oXml:find("DATA") // тут делать проверки o:=o:find("CONSTANTS") // тут делать проверки o:=o:find("ELEMENTS") // тут делать проверки Накидал SeekXML (если уже что то есть в этом плане , ткните носом ) [pre2] Func SeekXML(oXml,aTitle,apos) local o ,j:=0 if apos==NIL apos:=Array( len(aTitle) ) apos:=Afill(apos,1) endif do while j < len(aTitle) ++j if j==1 o:=oXml:find( aTitle[ 1 ],apos[ 1 ]) if empty(o) return nil endif else o:=o:find( aTitle[ j ],apos[ j ]) if empty(o) return nil endif endif enddo return o [/pre2] Пример вызова OX:=SeekXML(oXml,{"DATA","CONSTANTS","ELEMENTS"}) а далее потрошим объект OX на атрибуты , предварительно проверив что OX не NIL

SergKis: Dima Цель обработки xml ?

Dima: SergKis пишет: Цель обработки xml ? Выбрать нужные данные и затем сложить их в общую базу. По ходу не понял как верно преобразовать XML из UTF-16 в UTF-8 Пробовал так HB_STRTOUTF8( WIN_WIDETOANSI(hb_MemoRead(hb_DirBase()+"test16.xml")) ,"RU1251") Все как бы нормально , но в самом конце добавилось целая куча вопросиков , примерно 7 тыщ штук ))

SergKis: Dima пишет Выбрать нужные данные и затем сложить их в общую базу. через рабочий файл или сразу в базу ? Пример вызова OX:=SeekXML(oXml,{"DATA","CONSTANTS","ELEMENTS"}) какой запрос будет здесь [pre2] <DOCUMENTS> <DOCUMENT GUID="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE" Comment="Заказы" > <ELEMENTS> <ITEM GUID="E9752AD9-17DB-489F-E40F-B0B72D211628" dt="2011-05-26T17:58:02" IsDeleted="0" IsPost="0" DocNumber="ТДАБ0002" A01="6894BE95-972E-4BDB-B7D3-84D7F378EA2F" A02="BD72D900-55BC-11D9-848A-00112F43529A" A06="0.00" A08="0.00" A09="0.000" A010="2011-05-26T11:34:55" A011=""/> <ITEM GUID="F28210DD-F7DB-4428-A5A6-BFDD69F71978" dt="2011-06-03T14:43:28" IsDeleted="0" IsPost="1" DocNumber="ТДАБ0003" A01="6894BE95-972E-4BDB-B7D3-84D7F378EA2F" A02="BD72D900-55BC-11D9-848A-00112F43529A" A03="CBCF494B-55BC-11D9-848A-00112F43529A" A04="5669DC72-64A6-11DF-B11F-001921430A4C" A05="CBCF494C-55BC-11D9-848A-00112F43529A" A06="3.00" A07="CBCF495D-55BC-11D9-848A-00112F43529A" A08="6057.83" A09="0.000" A010="2011-06-03T14:42:42" A011=""> <TABLES> ... [/pre2]

Dima: SergKis пишет: через рабочий файл или сразу в базу ? собираю во временном а затем в базу SergKis пишет: какой запрос будет здесь Дорабатывать надо SeekXML А что насчет UTF16 в UTF8 что бы без косяков ?

SergKis: Dima пишет А что насчет UTF16 в UTF8 что бы без косяков ? думал так 1. сетавим cdp utf16 s := hb_memowrit("test.xml") hb_memowrit("tutf8.xml", hb_StrToUtf8(s)) 2. сетавим cdp ru1251 читаем "tutf8.xml" в oXml и работаем, там где читаем данные символьные делаем hb_Utf8ToStr(), как показывал в функции Get_Value(...) Dima пишет собираю во временном а затем в базу Дорабатывать надо SeekXML т.е. 1. надо тегам, атрибутам поставить в соотв. файл, структуру 2. завести обработчики для записи из xml в соотв. файл, поле (возможно с valid-ом, range) получ. данных может пойти др. путем (тут hash подйдет) 1. поставить соотв. тег, атрибут - структуре поля 2. поставить соотв. тег, атрибут блоку кода, передавая ьуда объект тега 3. тогда просто обходим все обекты - создаем временные, открываем dbf с алиасом тега например 4. повторный обход для выполнения блоков кода по переносу в dbf данных блоками кода, передавая туда объкт с атрибутами

Dima: SergKis пишет: думал так Это не работает. Только ты ошибся . У меня на входе XML в кодировке UTF-16 (utf-16 little endian) и его (данные из него) надо преобразовать в любую читаемую кодировку и читать его как XML. Вариант с WIN_WIDETOANSI(hb_MemoRead(hb_DirBase()+"test16.xml")) работает , но , куча вопросиков рождается в самом конце (писал выше). Дурдом с этим UTF-16......

SergKis: Dima пишет на входе XML в кодировке UTF-16 я думал сам файл. Тогда надо перекодировать только данные строк с Utf16 пробни с oXml выдернуть GUID значение и перевести только его WIN_WIDETOANSI

Dima: а есть разница Сергей ? переводить только нужную строку (значение) или весь файл с помощью WIN_WIDETOANSI попробую , но что мне кажется что будет глючить. отпишу... Спасибо !



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