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




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


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

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

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


администратор




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

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