On-line: Haz, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
администратор




Пост N: 5883
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.07.16 14:30. Заголовок: Снова XML


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

Минимум нужно корректное чтение !

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 61 , стр: 1 2 3 4 All [только новые]


постоянный участник




Пост N: 1085
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 16:08. Заголовок: Давно использую для ..


Давно использую для чтения предложенное от А.Кресина. Пример: Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1086
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 16:13. Заголовок: PS чуть поехало в ко..


PS
чуть поехало в конце
 
k := len(o:aItems)
FOR i := 1 TO k
j := o:aItems[ i ]
ArrOrderHead(j:title, Get_Value(j, 1))
NEXT

Пример xml:Скрытый текст



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5884
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.07.16 16:30. Заголовок: Ты про эту ? /* * ..


Ты про эту ?
 
/*
* $Id: hxmldoc.prg 2265 2014-06-11 08:54:33Z alkresin $
*
* Harbour XML Library
* HXmlDoc class
*
* Copyright 2003 Alexander S.Kresin <alex@kresin.ru>
* www - http://www.kresin.ru
*/


та что на сайте у него в сырцах HWGUI ?
А что насчет UTF-16 ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1087
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:08. Заголовок: Dima пишет та что на..


Dima пишет
 цитата:
та что на сайте у него в сырцах HWGUI ?
А что насчет UTF-16 ?


Брали оттуда для hb 2.0, так и работаем. Вроде в hb 3.2 похожий, а может и тот же - не смотрел.
С Utf8 просто:
1. если файл xml с BOM, то откусываем BOM
IF left(j, 3) == chr(239)+chr(187)+chr(191); j := subs(j, 4)
ENDIF
3. Получаею значения
 
...
k := len(o:aItems)
FOR i := 1 TO k
j := o:aItems[ i ]
ArrOrderHead(j:title, Get_Value(j, 1))
NEXT
...
FUNCTION Get_Value( o, n, lUtf8 )
LOCAL j

Default lUtf8 := m->lUtf8Set

IF n == NIL; n := 1
ENDIF
j := o:aItems[ n ]
IF valtype(j) == "C"
If lUtf8; j := hb_Utf8ToStr(j)
EndIf
ELSE ; j := ""
ENDIF

RETURN j

Формирую xml как правило так: Скрытый текст

где ^... - типа макроса для получения данных в тэг (<TotalGrossAmount>^OS_6+OS_4</TotalGrossAmount>)
а ^- ( <TotalRounding>^-</TotalRounding> ) - тэг может отсутсвовать или быть пустым


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1088
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:15. Заголовок: PS тексты языковые т..


PS
тексты языковые так
<StreetAndNumber>^gT("StreetR")</StreetAndNumber> - рус. текст
<StreetAndNumber>^gT("StreetL")</StreetAndNumber> - лат. текст
внутри gt(...)
If lUtf8; cTxt := hb_Str2Utf8(cT)
cdp установлена должна быть правильной для работы hb_StrToUtf8, hb_Utf8Str

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1089
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:30. Заголовок: PS 2 для ясности, чи..


PS 2
для ясности, читаю этот шаблон теми же средсвами, подставляю мкросы и вывожу в new.xml
секции xml цикловые
<Line>
<Line-Item>
...
</Line-Item>
...
</Line>
кручу в цикле DO WHILE ! EOF() ... заполняя данными макросов и подавая строки на выход


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5885
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.07.16 17:34. Заголовок: Сергей я стопитсотый..


Сергей я в стопитсотый раз спрашиваю а как быть с UTF-16 а ты все молчишь
Или я чего пропустил ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1091
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:46. Заголовок: Dima Мне странно, ч..


Dima
Мне странно, что файл xml в unicode, даже не встречал в реале.
В Dos у нас была утилитка перезаписи unicode -> Lv866
Возми в редактор ( можно notepad.exe, notepad2.exe) и перекодируй в Utf8, возможно где то есть готовые утилитки

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5886
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.07.16 17:48. Заголовок: :sm12: Это должен ..



Это должен быть автомат.
Вот чего пишут в протоколе обмена
 
• Структура файла обмена данными
Файл обмена данными представляет собой ZIP-архив, который может быть защищен паролем.
Загружаемый в МУ архив с данными имеет название "From1C.zip" и внутри архива могут находиться следующие файлы:
• XML-файл описания данных "FromCDB.xml". Формат XML-файла описывается в разделах ниже.
При выгрузке данных из МУ формируется архив с названием "To1C.zip" и внутри архива могут находиться следующие файлы:
• XML-файл описания данных "ToCDB.xml". Формат XML-файла описывается в разделах ниже.
• Формат XML-файлов обмена данными
Первая строка XML-файла называется объявлением XML – это строка, указывающая версию XML. Также здесь должна быть указана
кодировка символов.
Файл выгрузки из МУ имеет кодировку "UTF-16", файл загрузки в МУ из ЦБД может иметь кодировки "UTF-8", "UTF-16".
Далее следует корневой тэг DATA. Атрибуты тэга описаны в таблице ниже.



Файл выгрузки идет из проги под Андроид

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1092
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:51. Заголовок: Dima в hb 3.2 есть ..


Dima
в hb 3.2 есть src\codepage\cp_u16le.c
static HB_CDP_GET_FUNC( UTF16LE_get )
...
так что думаю есть и установка cdp для нее, ставь, читай файл и делай hb_StrToUtf8

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1093
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:56. Заголовок: Dima пишетФайл выгру..


Dima пишет
 цитата:
Файл выгрузки идет из проги под Андроид


Ну да с телефона xml я еще не принимал

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3465
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.07.16 17:58. Заголовок: Как вариант: перекод..


Как вариант: перекодировать файл в utf-8, работать с ним, а результат перекодировать в utf-16.
С xml в utf-8 я успешно работаю как раз с помощью библиотеки А.Кресина.
Непосредственно с utf-16 она конечно будет работать некорректно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1094
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 17:58. Заголовок: Dima пишет Первая с..


Dima пишет
 цитата:
Первая строка XML-файла называется объявлением XML – это строка, указывающая версию XML. Также здесь должна быть указана кодировка символов


у меня
<?xml version="1.0" encoding="Utf-8"?>
а у тебя ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5887
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.07.16 18:29. Заголовок: SergKis Пример: &#..


SergKis
 
Пример:
<?xml version="1.0" encoding="utf-16"?>
<DATA>
<CONSTANTS>
...
</CONSTANTS>
</DATA>



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1095
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.07.16 18:55. Заголовок: Dima тогда по Пашин..


Dima
тогда по Пашиному рецепту
 цитата:
перекодировать файл в utf-8, работать с ним, а результат перекодировать в utf-16.


если принимаешь данные, то достаточно "перекодировать файл в utf-8" и отработать, например как у меня на библиоте А.Кресина
если надо отдавать, то формируешь вых. xml в Utf8 (любым способом) и потом "результат перекодировать в utf-16"

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5888
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.07.16 21:54. Заголовок: Всем спасибо , нужно..


Всем спасибо , нужно переварить это дело.
Доки на родном языке я так понял нет к библиотеке А.Кресина.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5889
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 10:10. Заголовок: Не пойму что ей надо..


Не пойму что ей надо :)
 
#include "hxml.ch"

Proc main
local oXml,oXmlDoc

REQUEST HB_LANG_RU866
HB_LANGSELECT("RU866")

REQUEST HB_CODEPAGE_UTF16LE
REQUEST HB_CODEPAGE_UTF8
REQUEST HB_CODEPAGE_RU866
hb_cdpSelect( "RU866" )



oXml := HXMLDoc():Read( "test.xml" )

oXmlDoc := oXml:find("CONSTANTS")

? empty( oXmlDoc ) // .T.
wait
return nil

Не находит CONSTANTS
Скрытый текст



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1234
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.07.16 10:24. Заголовок: Dima, насколько я по..


Dima, насколько я понимаю, в этом xml нет корневого элемента, обрамляющего все остальные элементы.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5890
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 10:34. Заголовок: PSP Тэг DATA корнев..


PSP
Тэг DATA корневой

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1235
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.07.16 10:49. Заголовок: Хотя да, не разгляде..


Хотя да, не разглядел)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1236
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.07.16 11:23. Заголовок: Щас посмотрел на мет..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1097
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.07.16 13:13. Заголовок: PS так надо For i :=..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1237
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.07.16 13:26. Заголовок: SergKis пишет: Над..


SergKis пишет:

 цитата:
Надо сначала получать "DATA" в него вложены другие тэги


Ну да, как-то так...))

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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 не любит какие то символы.
Какие и на что их менять ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1238
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.07.16 14:35. Заголовок: Dima пишет: Хотелос..


Dima пишет:

 цитата:
Хотелось бы считать значения GUID и Value из всех полученных семи ITEM. Как ?


Они находятся в массиве aAttr, т.е. в примере это будет o:aAttr


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5892
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 14:43. Заголовок: Да я уже понял , опе..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1239
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 16.07.16 14:48. Заголовок: Да, обычный массив..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5893
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 14:49. Заголовок: PSP пишет: Да, обыч..


PSP пишет:

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


Печаль , с HASH было бы веселее.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

?


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5894
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 15:24. Заголовок: SergKis пишет: чем ..


SergKis пишет:

 цитата:
чем не устраивает


Да устраивает
Не подумал сразу об этом методе............жара..

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1099
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.07.16 17:40. Заголовок: Dima Цель обработки..


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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5896
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 17:49. Заголовок: SergKis пишет: Цель..


SergKis пишет:

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


Выбрать нужные данные и затем сложить их в общую базу.


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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>
...


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5897
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 18:44. Заголовок: SergKis пишет: чере..


SergKis пишет:

 цитата:
через рабочий файл или сразу в базу ?


собираю во временном а затем в базу

SergKis пишет:

 цитата:
какой запрос будет здесь


Дорабатывать надо SeekXML

А что насчет UTF16 в UTF8 что бы без косяков ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 данных блоками кода, передавая туда объкт с атрибутами




Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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......



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1102
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.07.16 21:41. Заголовок: Dima пишет на входе..


Dima пишет
 цитата:
на входе XML в кодировке UTF-16


я думал сам файл. Тогда надо перекодировать только данные строк с Utf16
пробни с oXml выдернуть GUID значение и перевести только его WIN_WIDETOANSI

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5899
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 21:49. Заголовок: а есть разница Серге..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5900
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.16 21:53. Заголовок: Pasha пишет: Как ва..


Pasha пишет:

 цитата:
Как вариант: перекодировать файл в utf-8, работать с ним


Павел наверное знает как , но пока молчит.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3466
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.07.16 22:27. Заголовок: Перекодировать можно..


Перекодировать можно вызовом:

Extern HB_CODEPAGE_UTF8, HB_CODEPAGE_UTF8EX, HB_CODEPAGE_UTF16LE
..
c2 := HB_Translate(c1, 'UTF8', 'UTF16LE')

ну и наоборот.

И маленькая хитрость: вместо того, чтобы создавать промежуточные файлы, можно для класса HXMLDoc вместо метода read использовать метод ReadString:

oXml:ReadString(HB_Translate(memoread(cFileName), 'UTF16LE', 'UTF8'))



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5901
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.07.16 09:03. Заголовок: Да Паш это работает ..


Да Паш это работает , спасибо !


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5902
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.07.16 17:38. Заголовок: Из доки по мобильной..


Из доки по мобильной проге
 
"3935BEAE-9F40-4BA5-BA9E-03F860CC1750"
"3343E400-1577-4DDE-9A82-BF1E53267FD6"
Идентификатор GUID имеет строго определенную структуру. Он состоит из 5 групп символов.
Первая группа состоит из 8 символов, вторая – из 4 символов, третья – из 4 символов,
четвертая – из 4 символов, пятая группа – из 12 символов.
Не допускаются пробелы перед идентификатором и после идентификатора,
указание разделителей "-" между символами в приведенных выше позициях обязательно.
Фигурные скобки перед и после идентификатора недопустимы (принятое обозначение для идентификаторов в OLE).
Допустимые символы в идентификаторе: от "0" до "9" и от "A" до "F" (или от "a" до "f").


А теперь вопрос. В моей программе в справочнике контрагентов коды организаций
представлены в виде поля "kod_kl" "n" , 6 ,0. Все коды уникальны.
Мобильная база ни чего про мои коды не знает а понимает только GUID.
Есть ли функция преобразующая число в GUID и наоборот (из GUID получить мой обычный код) ?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1240
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 17.07.16 19:21. Заголовок: Dima пишет: Есть ли..


Dima пишет:

 цитата:
Есть ли функция преобразующая число в GUID и наоборот (из GUID получить мой обычный код) ?


ЧислА длиной 6 знаков явно мало для отражения кода GUID. Может лучше в строку? Цифры из GUID от "0" до "9" преобразуются в "00" - "09", а цифры от "А" до "F" в "10" - "15". Обратно также. Т.е., на каждый символ GUID - 2 символа твоей строки. Дефисы оставить для удобства. Длина постоянна.
Вариант 2: создать у себя поле GUID для соответствия kod_kl.

update: точнее, имхо, вариант один: создать у себя поле GUID, чтобы получить однозначное соответствие с kod_kl

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3467
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.07.16 20:33. Заголовок: Для хранения guiid в..


Для хранения guid в числовом формате необходимо 16 байт, или 128 бит. Это 2 64-битных целых, учитывая нынешнюю архитектуру. Или две числовых переменных харбора.
А его строковое представление - это просто запись в 16-ричном формате, с разбивкой на группы. Соответственно, преобразующая функция - это любая функция для преобразований 16-ричных значений.
Но вопрос: стоит ли делать такие преобразования ? Может лучше привязать kod_kl к guid в его строковом представлении, как предложил PSP ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5903
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.07.16 21:23. Заголовок: То есть пойти тупо в..


То есть пойти тупо в лоб мануальным путем ?
Есть у меня код клиента 123
Преобразую его так скажем в GUID , вида
GUID="00000123-0001-0000-0000-000000000000"
Где в первой части код клиента , во второй признак 1 что это контрагент

Группы товара
GUID="00000007-0002-0000-0000-000000000000"
Где в первой части код группы , во второй признак 2 что это группа товара

Товарная позиция
GUID="00000301-0003-0000-0000-000000000000"
Где в первой части код товара , во второй признак 3 что это товарная позиция

C ихними GUID точно не пересечется.

Как они посчитали GUID ниже х... знает
 
<ELEMENTS>
<ITEM GUID="BD72D900-55BC-11D9-848A-00112F43529A" IsDeleted="0" Name="Торговый дом &quot;Комплексный&quot; " A02="0" A05="7705260699" A06="770501001" A07="" A04="(095) 1123456, доб. 789" A03="117452, Москва г, Симферопольский б-р, дом № 78, корпус 1" A09="112435, Москва, Одесская улица, дом № 67, корпус 1, кв.78" A010="ТД"/>
<ITEM GUID="EF8F948C-8403-11DA-9AE9-000D884F5D77" IsDeleted="0" Name="Cтройснаб" A02="1" A05="7723240668" A06="772301001" A07="" A04="" A03="" A09="" A010="ССН"/>
</ELEMENTS>



Завтра задам вопрос разрабам.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3468
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.07.16 21:49. Заголовок: Дык A05 - это ИНН, A..


Дык A05 - это ИНН, A06 - КПП, что однозначно определяет контрагента

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5904
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.07.16 21:54. Заголовок: Pasha пишет: Дык A0..


Pasha пишет:

 цитата:
Дык A05 - это ИНН, A06 - КПП, что однозначно определяет контрагента


Эти реквизиты заполнены не у всех :)

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5913
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.07.16 12:24. Заголовок: SergKis В общем сде..


SergKis
В общем сделал так в тестовом варианте , вроде пашет.
 
cc:=hb_MemoRead(hb_DirBase()+"tocdb.xml")

oXml := HXMLDoc():ReadString( cc )
if oXml==nil
return nil
endif


o:=oXml:find("DATAEXPORT")
if o==nil
return nil
endif

o1:=o:find("DOCUMENTS")
if o1==nil
return nil
endif

for i=1 to len(o1:aitems)
j := o1:aItems[ i ]
if j==nil
return nil
endif


if j:title=="DOCUMENT" .and. j:GetAttribute("GUID")=="E01E1F5C-D6E4-46E8-B923-3758B0D79BDE"
o2:=j:find("ELEMENTS")
if o2==nil
return nil
endif


for k=1 to len(o2:aitems)
t:=o2:aItems[ k ]
if t==nil
return nil
endif

? t:GetAttribute("GUID"),t:GetAttribute("DT"),t:GetAttribute("DocNumber") // читаем заголовок заявки
t1:=t:find("TABLES")
if t1==nil
return nil
endif

t2:=t1:find("TABLE")
if t2==nil
return nil
endif

for z=1 to len(t2:aitems) // читаем содержимое заявки
ee:=t2:aItems[ z ]
? ee:title,ee:GetAttribute("A05"),ee:GetAttribute("DocID")
next

next
exit
endif
next



Сам XML
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1105
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.07.16 18:19. Заголовок: Dima :sm36: Предл..


Dima
Предлагаю подумать над таким решением (схема) Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5916
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.07.16 18:42. Заголовок: SergKis Спасибо , и..


SergKis
Спасибо , изучу подход

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6135
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.11.16 14:15. Заголовок: Есть вот такой XML ,..


Есть вот такой XML , таблица в общем
 
<?xml version="1.0" encoding="utf-8"?>
<points>
<tt>
<id>526645</id>
<code1C>12345</code1C>
<name>Зиневич проба</name>
<client>Зиневич</client>
<address></address>
<lon>0</lon>
<lat>0</lat>
<radius>100</radius>
<comment></comment>
<user></user>
<enabled>true</enabled>
</tt>
<tt>
<id>526750</id>
<code1C>359514069607817_new_01-03-04</code1C>
<name>чп Тригуба</name>
<client>Завгородний</client>
<address>Таврийск, вулиця Зои Комсмедемянской 15</address>
<lon>33.4453</lon>
<lat>46.7576</lat>
<radius>100</radius>
<comment>работаем</comment>
<user></user>
<enabled>false</enabled>
</tt>
</points>


Попытался ее прочитать с помощью библитеки Кресина.
 
oXml := HXMLDoc():ReadString( hb_MemoRead("1.xml") )
if oXml==nil
return nil
endif
o:=oXml:find("points")
if o==nil
return
endif

FOR i=1 to len(o:aitems)
o1 := o:aItems[ i ]
// полагал что тут будет работать o1:GetAttribute("id") или o1:GetAttribute("code1C") но выдает NIL
// поэтому слепил код что ниже

//? hb_valtoexp(o1)
if o1:Title=="tt"
for j=1 to len(o1:aitems)
o2:=o1:aItems[ j ]
? o2:Title,if( len(o2:Aitems)#0,o2:Aitems[1],"")
next
endif
wait
NExt


Вопрос в коменте кода. Не так его разбираю что ли ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1312
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.11.16 14:58. Заголовок: Dima Атрибут это вн..


Dima
Атрибут это внутри тега
<tag1 attr1 = "aaa" attr2 = "bbb">value</tag1>
получив oXml сделай
for i := 1 to len(oXml:aItems)
? valtype(oXml:aItems[ i ]), oXml:aItems[ i ]
next
и см. что там

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1313
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.11.16 15:02. Заголовок: PS если обект, то ?..


PS
если обект, то
? oXml:aItems[ i ]:Title

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6136
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.11.16 15:07. Заголовок: Сергей Tiltle я счит..


Сергей Tiltle я считал , показал как в коде выше
А как считать значение ?
Получается только так
 
if o1:Title=="tt"
for j=1 to len(o1:aitems)
o2:=o1:aItems[ j ]
? o2:Title,if( !empty(o2:Aitems),o2:Aitems[ 1] ,"--------")
next
endif



В общем ладно , работает да и бог с ним. Спасибо !
На выходе по этому коду что выше получаю так
 
id 526645
code1C 12345
name Зиневич проба
client Зиневич
address --------
lon 0
lat 0
radius 100
comment --------
user --------
enabled true


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1314
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.11.16 15:16. Заголовок: Dima Если бы прокру..


Dima
Если бы прокрутил цикл, увидел, как все устроено, т.е.
o:title == "points" будет содержать объект, в котором o:find('tt') вернет обект, в котором
o:find('id') вернет значение id тега, т.е. извлекаем данные
o:find('code1C') и т.д.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6137
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.11.16 15:33. Заголовок: SergKis Попробовал ..


SergKis
Попробовал , не получилось.
Оставил так
 
o:=oXml:find("points")
if o==nil
return
endif

FOR i=1 to len(o:aitems)
o1 := o:aItems[ i ]

if o1:Title=="tt"

for j=1 to len(o1:aitems)

o2:=o1:aItems[ j ]
? o2:Title,if( !empty(o2:Aitems),o2:Aitems[ 1 ],"--------")

next
endif

NEXT



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1316
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.11.16 21:30. Заголовок: Dima пишет Попробова..


Dima пишет
 цитата:
Попробовал , не получилось.


Глянул у себя, почему работает ? Нашел - правил метод Find
 
METHOD Find( cTitle,nStart,block ) CLASS HXMLNode
Local i

IF nStart == Nil
nStart := 1
ENDIF

If len(::aItems) == 1 .and. Valtype(::aItems[1]) == "C"
Return ::aItems[1]
EndIf

DO WHILE .T.
i := Ascan( ::aItems,{|a|Valtype(a)!="C".AND.a:title==cTitle},nStart )
IF i == 0
EXIT
ELSE
nStart := i
IF block == Nil .OR. Eval( block,::aItems )
Return ::aItems
ELSE
nStart ++
ENDIF
ENDIF
ENDDO

Return Nil


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6139
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.11.16 22:29. Заголовок: Понял Сергей. Не люб..


Понял Сергей.
Не люблю я править авторские сырцы.
Спасибо за желание помочь !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1317
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.11.16 23:12. Заголовок: Dima пишет Не люблю ..


Dima пишет
 цитата:
Не люблю я править авторские сырцы.


А как же open source ?
С изменениями, твой код выглядел бы (как вариант) так
 
FUNCTION Main()
Local a,i,n,v,op,ot,aV := {},aA := {}

If ( oXml := HXMLDoc():ReadString( hb_MemoRead("1.xml") ) ) == NIL
return Nil
endif

If ( op := oXml:find("points") ) == NIL
return Nil
endif

n := {'id' , ; // что выбирать - заказ
'code1C' , ;
'client' , ;
'address', ;
'lon' , ;
'lat' , ;
'radius' , ;
'comment', ;
'user' , ;
'enabled' ;
}


For i := 1 To len(op:aItems)
ot := op:aItems[ i ]
v := {}
a := {}
If hb_IsObject(ot) .and. ot:title == 'tt'
AEval(n, {|t| aAdd(v, op:find(t)) }) // по заказу или
AEval(ot:aItems, {|o| aAdd(a, {o:title, o:find(o:title)}) }) // все выбираем
aAdd(aV, v)
aAdd(aA, a)
EndIf
Next

RETURN NIL


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 61 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 101
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет