On-line: Andrey, NickSam, гостей 0. Всего: 2 [подробнее..]
АвторСообщение





Пост N: 417
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 24.02.22 18:09. Заголовок: Проблема с именами тэгов на кирилице в XML файлах. Пособите пожалуйста


Наткнулся на "нежданчик". Оказывается раньше читал их XML файлов различных кодировок, где тэги были на латыни и всё было хорошо, например в файле всё будет замечательно работать
 
<?xml version="1.0" encoding="utf-8"?>
<ORDER>
<DOCUMENTNAME>220</DOCUMENTNAME>
<NUMBER>23000B3094059</NUMBER>
<DATE>2021-10-18</DATE>
<DELIVERYDATE>2021-10-21</DELIVERYDATE>
<DELIVERYTIME>00:00</DELIVERYTIME>
</ORDER>


Полностью работающая конструкция:

oDoc := TXmlDocument():new()
oDoc:read( MemoRead(cXml) )
oUrl := oDoc:findFirst( "DATE" )
IF oUrl <> NIL THEN dOrdb := dEgaToDat( Alltrim(oUrl:cData) )

… и dOrdb имеет реальное значение, но стоит добавить в XML тэг на кирилице, например
 
<?xml version="1.0" encoding="utf-8"?>
<ORDER>
<DOCUMENTNAME>220</DOCUMENTNAME>
<NUMBER>23000B3094059</NUMBER>
<DATE>2021-10-18</DATE>
<Вася>2021-10-21</Вася>
<DELIVERYTIME>00:00</DELIVERYTIME>
</ORDER>


как в конструкции
oUrl := oDoc:findFirst( "DATE" )
oUrl == NIL

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 13 [только новые]


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




Пост N: 7629
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.22 18:36. Заголовок: AndreyZh пишет: но ..


AndreyZh пишет:

 цитата:
но стоит добавить в XML тэг на кирилице, например


Вполне возможно....
Можно попробовать библиотеку Кресина (я её юзаю) HXMLDoc
Брать на сайте у него а живет в библе (сырцы) HWGUI

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




Пост N: 4079
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.02.22 18:41. Заголовок: AndreyZh У вас данн..


AndreyZh
У вас данные в utf-8, имена тэгов (два байта для рус. букв), а в классе работа с однобайтными данными в именах тэгов, не смотрел класс TXmlDocument, но думаю причина в этом. Как вариант:
1. составить hash справочник перекодировки тэгов RU => EN
2. прочитать hb_memoread(...xml), ф-ями для работы с utf8 найти по списку hash и заменить на EN тэги
3. сохранить hb_memwrit(...new.xml,...)
4. потом обработать классом TXmlDocument
5. Если надо использовать названия тэгов на рус. яз. сделать обратные действия по hash, заменив EN на RU

Другой вариант, взять файл xml редактором с кодовой страницей utf-8, Ctrl+A, Ctrl+C и перенести в редактор с кодовой страницей 1251 Ctrl+V, сохранить и обработать классом TXmlDocument по вашему примеру выше.

Dima пишет
 цитата:
Можно попробовать библиотеку Кресина (я её юзаю) HXMLDoc


Думаю не поможет, там парсинг на C и наверно исп. однобайтная работа с тэгами

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




Пост N: 7630
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.02.22 18:42. Заголовок: SergKis +1..


SergKis
+1

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





Пост N: 418
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 24.02.22 19:40. Заголовок: SergKis спасибо! Буд..


SergKis спасибо! Буду думать, хотя и такой подход не совсем нравится. Что по кодировке - написал, что в любой, т.к. изначально "пляски" начались от электронного УПД, что в формате 1251... и весь электронный государственный документооборот в хмл файла с тегах на кирилице

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




Пост N: 4080
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.02.22 20:07. Заголовок: AndreyZh пишет весь ..


AndreyZh пишет
 цитата:
весь электронный государственный документооборот в хмл файла с тегах на кирилице


Зачем тогда
 цитата:
<?xml version="1.0" encoding="utf-8"?>


Используйте <?xml version="1.0" encoding="1251"?> (не помню, как правильно) или напишите перекодировку из utf-8 => Ru1251, т.е. перезапись файла, что то типа такого
cOld := hb_cdpSelect( "UTF8" )
cBuf := hb_memoread(...xml)
IF left(cBuf, 3) == hb_utf8Chr( 0xFEFF ) ; cBuf := subs( cBuf, 4 )
ENDIF
hb_memowrit( ...new.xml, hb_Utf8ToStr(cBuf, "RU1251") )
hb_cdpSelect( cOld )

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




Пост N: 4081
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.02.22 20:37. Заголовок: PS. Для HXMLDoc от А..


PS. Для HXMLDoc от А.Кресина можно так делать (CODEPAGE стоит RU1251)
 
cXml := hb_memoread(Xml)

If IsUtf8Bom(cXml)
cXml := subs(cXml, Len(Utf8Bom())+1)
cXml := hb_Utf8ToStr(cXml)
ElseIf hb_StrIsUTF8(cXml)
cXml := hb_Utf8ToStr(cXml)
EndIf

oXml := HXMLDoc():Read( , cXml)
...
FUNC IsUtf8Bom( cTxt )
LOCAL cBom := hb_utf8Chr( 0xFEFF )
LOCAL lRet := .F.

If ! empty(cTxt); lRet := left(cTxt, Len(cBom)) == cBom
EndIf

RETURN lRet


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





Пост N: 419
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 24.02.22 20:40. Заголовок: SergKis, как отмечал..


SergKis, как отмечал, что сие касается любой кодировки. Фрагмент изначального файла для парсинга:

 
<?xml version="1.0" encoding="windows-1251"?>
<Файл ВерсПрог="Lera_edi v. 24.10.2019" ВерсФорм="5.01" ИдФайл="ON_NSCHFDOPPR_2LHD826718C-0312-4657-B0A7-E4413957CF8F_2LH64ABCF29-EB18-40C9-9571-0565DD31FA89_20200327_a078b830-26d0-44e2-8aa8-6d10ce82757c">
<СвУчДокОбор ИдОтпр="2LH64ABCF29-EB18-40C9-9571-0565DD31FA89" ИдПол="2LHD826718C-0312-4657-B0A7-E4413957CF8F">
<СвОЭДОтпр ИННЮЛ="7723815417" ИдЭДО="2LH" НаимОрг="ООО &quot;ФораПром&quot;"/>
</СвУчДокОбор>
<Документ ВремИнфПр="12.08.20" ДатаИнфПр="27.03.2020" КНД="1115131" НаимДокОпр="Счет-фактура и документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)" НаимЭконСубСост="Индивидуальный предприниматель Саркисян Вардан Анзорикович" ПоФактХЖ="Документ об отгрузке товаров (выполнении работ), передаче имущественных прав (документ об оказании услуг)" Функция="СЧФДОП">
<СвСчФакт ДатаСчФ="26.03.2020" КодОКВ="643" НомерСчФ="34801">
<ИспрСчФ ДефДатаИспрСчФ="-" ДефНомИспрСчФ="-"/>
<СвПрод ИнфДляУчаст="4607124669999">
<ИдСв>
<СвИП ИННФЛ="644901100440" ИныеСвед="4607124669999" СвГосРегИП="304644934500411">


Для меня сие случилось полным нежданчиком, т.к. формирование УПД средствами Harbour с тегами на кирилице проблем никогда не было, например:
 

// Создаём первый XML узел описания контрагента. Добавляем в корень дерева
oMain := TXmlNode():new( , HB_OEMTOANSI("Контрагенты"), {HB_OEMTOANSI('ИдКонтр') => cReg, HB_OEMTOANSI('П000000000007') => HB_OEMTOANSI(Alltrim(name)) })
oDocument:addBelow(oMain)

oPosition := TXmlNode():new( ,HB_OEMTOANSI("Резидент") ) // Тип контейнер
oMain:addBelow(oPosition)

// Для поставщиков алкогольной продукции отражаем реквизиты лицензии - не пиво и есть лицензия у КА
IF (nAlco <> 2) .AND. !Empty(numbLic)
oLic := TXmlNode():new( ,HB_OEMTOANSI("Лицензии") ) // Тип контейнер
oPosition:addBelow(oLic)

// Описание лицензии в составном тэге
oUrl := TXmlNode():new( , HB_OEMTOANSI("Лицензия"), {HB_OEMTOANSI('ИдЛицензии') => "7", HB_OEMTOANSI('П000000000011') => HB_OEMTOANSI(Alltrim(serLic))+","+HB_OEMTOANSI(Alltrim(numbLic)), HB_OEMTOANSI('П000000000012') => Dtoc(datLic), HB_OEMTOANSI('П000000000013') => Dtoc(endLic), HB_OEMTOANSI('П000000000014') => HB_OEMTOANSI(Alltrim(kemLic)) })
oLic:addBelow(oUrl)



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





Пост N: 420
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 25.02.22 09:16. Заголовок: Dima пишет: Можно п..


Dima пишет:

 цитата:
Можно попробовать библиотеку Кресина (я её юзаю) HXMLDoc



На сайте Александра есть лишь минимум справки по данной библе, а есть ли где примеры пользования или что-то типа инструкции?

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


Пост N: 1472
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 25.02.22 10:46. Заголовок: Примеры использовани..


Примеры использования есть в hwgui/utils/tutorial/tutor.prg, hwgui/utils/editor/editor.prg, hwgui/utils/designer/designer.prg - функции ReadIni (там ini-файлы в xml-формате).
Ну и prg-исходник можно посмотреть, hwgui/source/common/xml/hxmldoc.prg, он небольшой и несложный.

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




Пост N: 4083
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.02.22 11:59. Заголовок: AndreyZh пишет есть ..


AndreyZh пишет
 цитата:
есть ли где примеры пользования или что-то типа инструкции?


Кусок кода, как есть, чтение xml (Возвратный ордер из магазина) для просмотра в TsBrowse MiniGui, может пригодится
Скрытый текст


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




Пост N: 4084
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.02.22 12:00. Заголовок: PS До кучи шаблон xm..


PS
До кучи шаблон xml (их несколько) для формирования и отправки, т.е. шаблон читаю в HXMLDoc и заполняю тэги по выражениям, записанным в них.
Если результатом выражения будет "-", то тэг на выход не идет. У вас программный код, у меня шаблоны xml. Для печати (pdf) похожая схема - шаблоны
Скрытый текст

Это мой давний опыт работы с xml
PS. Секция <Invoice-Lines> - организует цикл вывода по детальным строкам документа

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





Пост N: 421
Зарегистрирован: 12.11.06
ссылка на сообщение  Отправлено: 25.02.22 12:41. Заголовок: alkresin SergKis бол..


alkresin SergKis большое спасибо! Потом буду обязательно изучать, т.к. ограничения штатных средств критичны... а пока нашел примитивное универсальное решение для моей конкретной задачи

 

* --------------------------------------------------------------------------------------------------
* Извлечение информации по шаблону из строки, содержащий весь документ. Полагаем, что шаблон типа:
* teg="инфа", т.е. информация заключена точно между кавычками
* cStr Строка для поиска инфы
* cTeg Ключевой тэг
* nBeg Стартовое положение в строке для поиска
STAT FUNC cReadTeg(cStr,cTeg,nBeg)
LOCA cRet:="", ns:=0, nb:=0, ne:=0, cC:=""

cStr := Subs(cStr,nBeg) // Выделяю область для поиска первого вхождения

// Выходим, если тэг не найден
IF (ns:=At(cTeg,cStr)) <= 0 THEN RETU ""
cStr := Subs(cStr,ns)
IF (ns:=At('="',cStr)) <= 0 THEN RETU ""

// Извлекаю нужное содержимое, находящееся между кавычками
cRet := Token( Subs(cStr,ns+2), '"', 1 )
RETU cRet


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




Пост N: 4085
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.02.22 19:01. Заголовок: SergKis пишет шаблон..


SergKis пишет
 цитата:
шаблон xml (их несколько) для формирования и отправки, т.е. шаблон читаю в HXMLDoc и заполняю тэги по выражениям


Делаю это таким кодом (когда заказ , тоже xml, обработан, по нему формируется xml счет для оплаты)
Скрытый текст


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

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