Автор | Сообщение |
|
| |
Пост N: 5883
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.07.16 14:30. Заголовок: Снова XML
Нужно создавать / читать XML в UTF-16 Что есть в этом плане в Harbour ? Минимум нужно корректное чтение !
|
|
|
Ответов - 61
, стр:
1
2
3
4
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1236
Зарегистрирован: 27.01.07
|
|
Отправлено: 16.07.16 11:23. Заголовок: Щас посмотрел на мет..
Щас посмотрел на метод find(). По-моему, что-то там не так с логикой сканирования массива ::aItems. При первом же несовпадении цикл завершается и никакого find не получается) Или я не туда смотрю?))
|
|
|
|
| постоянный участник
|
Пост N: 1096
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 13:11. Заголовок: PSP пишет По-моему,..
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
|
|
|
|
| постоянный участник
|
Пост N: 1097
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 13:13. Заголовок: PS так надо For i :=..
PS так надо For i := 1 To len(o:aItems)
|
|
|
|
| постоянный участник
|
Пост N: 1237
Зарегистрирован: 27.01.07
|
|
Отправлено: 16.07.16 13:26. Заголовок: SergKis пишет: Над..
SergKis пишет: цитата: | Надо сначала получать "DATA" в него вложены другие тэги |
| Ну да, как-то так...))
|
|
|
|
| |
Пост N: 5891
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 14:29. Заголовок: SergKis Да заработа..
SergKis Да заработало , спасибо Но дальше у меня снова затык 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 Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ? И еще вопрос , слышал что XML не любит какие то символы. Какие и на что их менять ?
|
|
|
|
| постоянный участник
|
Пост N: 1238
Зарегистрирован: 27.01.07
|
|
Отправлено: 16.07.16 14:35. Заголовок: Dima пишет: Хотелос..
Dima пишет: цитата: | Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ? |
| Они находятся в массиве aAttr, т.е. в примере это будет o:aAttr
|
|
|
|
| |
Пост N: 5892
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 14:43. Заголовок: Да я уже понял , опе..
Да я уже понял , опередил. Я так понимаю это не HASH массив и поэтому юзать надо цифры и что типа такого не прокатит j:aattr["GUID"]
|
|
|
|
| постоянный участник
|
Пост N: 1239
Зарегистрирован: 27.01.07
|
|
Отправлено: 16.07.16 14:48. Заголовок: Да, обычный массив..
Да, обычный массив
|
|
|
|
| |
Пост N: 5893
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 14:49. Заголовок: PSP пишет: Да, обыч..
PSP пишет: Печаль , с HASH было бы веселее.
|
|
|
|
| постоянный участник
|
Пост N: 1098
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 15:15. Заголовок: Dima ишет поэтому ю..
Dima ишет чем не устраивает 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 ?
|
|
|
|
| |
Пост N: 5894
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 15:24. Заголовок: SergKis пишет: чем ..
SergKis пишет: Да устраивает Не подумал сразу об этом методе............жара..
|
|
|
|
|
| |
Пост N: 5895
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 16:57. Заголовок: Что то меня запарило..
Что то меня запарило писать o:=oXml:find("DATA") // тут делать проверки o:=o:find("CONSTANTS") // тут делать проверки o:=o:find("ELEMENTS") // тут делать проверки Накидал SeekXML (если уже что то есть в этом плане , ткните носом ) 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 Пример вызова OX:=SeekXML(oXml,{"DATA","CONSTANTS","ELEMENTS"}) а далее потрошим объект OX на атрибуты , предварительно проверив что OX не NIL
|
|
|
|
| постоянный участник
|
Пост N: 1099
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 17:40. Заголовок: Dima Цель обработки..
Dima Цель обработки xml ?
|
|
|
|
| |
Пост N: 5896
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 17:49. Заголовок: SergKis пишет: Цель..
SergKis пишет: Выбрать нужные данные и затем сложить их в общую базу. По ходу не понял как верно преобразовать XML из UTF-16 в UTF-8 Пробовал так HB_STRTOUTF8( WIN_WIDETOANSI(hb_MemoRead(hb_DirBase()+"test16.xml")) ,"RU1251") Все как бы нормально , но в самом конце добавилось целая куча вопросиков , примерно 7 тыщ штук ))
|
|
|
|
| постоянный участник
|
Пост N: 1100
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 18:13. Заголовок: Dima пишет Выбрать н..
Dima пишет цитата: | Выбрать нужные данные и затем сложить их в общую базу. |
| через рабочий файл или сразу в базу ? цитата: | Пример вызова OX:=SeekXML(oXml,{"DATA","CONSTANTS","ELEMENTS"}) |
| какой запрос будет здесь <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> ...
|
|
|
|
| |
Пост N: 5897
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 18:44. Заголовок: SergKis пишет: чере..
SergKis пишет: цитата: | через рабочий файл или сразу в базу ? |
| собираю во временном а затем в базу SergKis пишет: Дорабатывать надо SeekXML А что насчет UTF16 в UTF8 что бы без косяков ?
|
|
|
|
| постоянный участник
|
Пост N: 1101
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 19:12. Заголовок: Dima пишет А что нас..
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 данных блоками кода, передавая туда объкт с атрибутами
|
|
|
|
| |
Пост N: 5898
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 21:34. Заголовок: SergKis пишет: дума..
SergKis пишет: Это не работает. Только ты ошибся . У меня на входе XML в кодировке UTF-16 (utf-16 little endian) и его (данные из него) надо преобразовать в любую читаемую кодировку и читать его как XML. Вариант с WIN_WIDETOANSI(hb_MemoRead(hb_DirBase()+"test16.xml")) работает , но , куча вопросиков рождается в самом конце (писал выше). Дурдом с этим UTF-16......
|
|
|
|
| постоянный участник
|
Пост N: 1102
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.07.16 21:41. Заголовок: Dima пишет на входе..
Dima пишет цитата: | на входе XML в кодировке UTF-16 |
| я думал сам файл. Тогда надо перекодировать только данные строк с Utf16 пробни с oXml выдернуть GUID значение и перевести только его WIN_WIDETOANSI
|
|
|
|
| |
Пост N: 5899
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.16 21:49. Заголовок: а есть разница Серге..
а есть разница Сергей ? переводить только нужную строку (значение) или весь файл с помощью WIN_WIDETOANSI попробую , но что мне кажется что будет глючить. отпишу... Спасибо !
|
|
|
Ответов - 61
, стр:
1
2
3
4
All
[только новые]
|
|