XML C8 - не понял...

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

XML C8 - не понял...

Сообщение Aragorn »

Сразу скажу - в Кларионе с ХМЛ ни разу не работал. Поэтому прошу помощи и советов.... Задача - закачать ХМЛ документ в память и работать с нодами, читая атрибуты и значения элементов. То есть документ примерно такой

< ?xml version="1.0" encoding="как там 1251"?>
<database attr1="val1">
<element attr2="val" attr3="val">
<e1>val1</el1>
<el2> val2</ el2>
</element>
</database>

В комплекте Клариона есть документ pdf с руководством, как работать с классом XML. Из этого документа выходит, что парсер XML клариона не может разбирать документы в которых присутствует смешение атрибутов и элементов. Это раз. Второе - с грехом пополам удалось подключить класс xml в тестовый проект (т.к. в этом документе нифига не сказано, как это делать), но при загрузке xml документа в... забыл, как это называется? что-то типа xmlExchancer (прошу прощения, клары под рукой нет) вылетают ошибки даже на элементарном документе. Выясняется, что в заголовке ХМЛ нельзя указывать кодировку! парсер не понимает этого! ну что за хрень! Кстати, то же руководство это подтверждает, что, мол, загрузить можно только то, что создано тем же классом!
Вопрос! Скорее всего ищу не то, не там и как всегда не так! Но как штатными средствами клариона 8 прочитать документ вышеобозначенной структуры??!
-------------------------------
В истинном золоте блеска нет...
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

XML C8 - не понял...

Сообщение Дед Пахом »

тут за последние полгода столько про xml понаписано... Поищи. Сам я юзаю свой EasyXML, так что не помощник.
С уважением, ДП
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

XML C8 - не понял...

Сообщение Aragorn »

ну... вообще-то я стараюсь следовать правилам хорошего тона, которые гласят, что прежде чем задать вопрос, надо воспользоваться поиском... увы, ничего путного не нашел... фишка в том, что низзя пользовать сторонние продукты, только чистый кларик. ну на крайняк бесплатный софт с открытыми исходниками. но это на самый крайняк!..
-------------------------------
В истинном золоте блеска нет...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

XML C8 - не понял...

Сообщение Игорь Столяров »

Странно. Ну вот же тема, в которой только что обсуждали вопрос: http://forum.clarionlife.net/phpbb/view ... f=1&t=3383
Загружать можно XML файлы созданные где угодно (какая разница ?!), но кодировка только UTF-8 (это обходится, см. тему по ссылке)
Не помню уже про C8, но в C91 в Examples есть пример выгрузки / загрузки XML - начни с него. Все прекрасно работает.
Описание в PDF - ископаемое для C63, в нем не совпадают прототипы методов для работы с XML, отсюда и ошибки.
Лучше см. описание методов в исходниках LibSrc.
Aragorn писал(а):фишка в том, что низзя пользовать сторонние продукты, только чистый кларик.
Это конечно можно, но придется работать. Много работать.
Решение задачи можно на порядок упростить используя бесплатную библиотеку iQXML http://www.paresi.net/clarion/index.html
К сожалению без исходников ...
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

XML C8 - не понял...

Сообщение Yufil »

Много раз писал, как это делать средствами Клариона, надо поискать в Clalist или здесь, на форуме
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

XML C8 - не понял...

Сообщение Aragorn »

а еще нашел в исходниках класс QuickXMLParser. Ради интереса привинтил к проекту, зарядил туда ХМЛ на 18 метров (600000 строк, шестьсот тысяч, прописью) - фигли, написано же - квик!!! и-... понял, что автор, видимо, был с юмором. Парсинг шел около 2,5 часов. Для примера - тот же ХМЛ файл в дельфях распарсился за 6 секунд!!!
Аааааа........
-------------------------------
В истинном золоте блеска нет...
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

XML C8 - не понял...

Сообщение Yufil »

А попробуй шаблон View XML (например, на обработчик по кнопке) для своего файла...
Правда, работает правильно только для UTF-8, придётся преобразовать для начала.
Если время разумное, можно двигаться дальше
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

XML C8 - не понял...

Сообщение Aragorn »

Попробую в понедельник...
-------------------------------
В истинном золоте блеска нет...
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

XML C8 - не понял...

Сообщение Yufil »

Aragorn писал(а): Из этого документа выходит, что парсер XML клариона не может разбирать документы в которых присутствует смешение атрибутов и элементов. Это раз. Второе - с грехом пополам удалось подключить класс xml в тестовый проект (т.к. в этом документе нифига не сказано, как это делать), но при загрузке xml документа в... забыл, как это называется? что-то типа xmlExchancer (прошу прощения, клары под рукой нет) вылетают ошибки даже на элементарном документе. Выясняется, что в заголовке ХМЛ нельзя указывать кодировку! парсер не понимает этого! ну что за хрень! Кстати, то же руководство это подтверждает, что, мол, загрузить можно только то, что создано тем же классом!
Вопрос! Скорее всего ищу не то, не там и как всегда не так! Но как штатными средствами клариона 8 прочитать документ вышеобозначенной структуры??!
1. Разбирать может.
2. Для подключения лучше всего где-нибудь в тёмном углу вызвать шаблон View XML и всё подключится
3. Парсер нормально принимает UTF-8 и ISO-8859-1, но можно 16-ричными редактором поменять ISO-8859-1 на Windows-1251 (там на 1 символ больше, не забываем <0> в конце строки), тогда по-русски будет кушать...

Пока скачай класс cstr, для работы с длинными строками и перекодировки в UTF-8, пригодится
https://mega.co.nz/#!RlAilJIT!2hvwWBkAn ... J3FmCLcmvw

Код: Выделить всё

              Include('cstr.inc')
... 
CS   Cstr
.... 
     CS.LoadFromfile(XMLFile) 
     WinPos#=Instring('"WINDOWS-1251"',Upper(CS.S[1:60],1,1)
     If WinPos#
           CS.S[WinPos : WinPos+13]='"UTF-8"'
            CS.ToUtf8()
      End
     CS.SavetoFile(UTF8File) 

перекодируют файл в UTF-8

Продолжу завтра, если лучше вариантов не найдётся.
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

XML C8 - не понял...

Сообщение Aragorn »

В общем дело продвинулось следующим образом. Класс ViewXML действительно работает с большим файлом почти с той же скоростью, что и парсер MS. Ну в целом приемлемо. Изучив класс, нарисовал такой тестовый пример:

Код: Выделить всё

Doc	&Document
QXML	Queue(DOMQueue)
	End
	
Code
Doc &= XMLFileToDom(fName)
FillDOMQueue(Doc, QXML)
Loop I# =  To Records(QXML)
	Get(QXML, I#)
	Stop(QXML.Level & ' - ' & QXML.node.GetNodeName() & ' - ' & QXML.node.GetNodeValue() & ' - ' & QXML.node.GetNodeType())
End
If not Doc &= null then Doc.Release() End		
Код работает, файл парсится, но все упирается в кодировку. Завтра буду пробовать предложенный Юрием способ перегона Windows-1251 в UTF-8, а на данный момент могу констатировать следующее.
1. Файл XML в формате Win-1251 гарантированно приводит к AV
2. Даже если файл XML в UTF-8, но в заголовке указано Win1251, AV гарантирован
3. Если файл XML в UTF-8 и в заголовке кодировка не указана, или указана UTF-8, файл парсится, все ноды со всеми значениями и атрибутами заносятся в очередь (которую потом пользует тот самый шаблон ViewXML), но!!!! ВМЕСТО РУССКОГО ТЕКСТА ПОЛНАЯ АБРАКАБАБРА!!! Хотя тот же файл через Internet Explorer, Notepad++. Oxygen и пр.пр.пр. смотрится вполне читаемым! Что не так? Повторюсь, перегнать Win-1251 в UTF-8 предложенным выше способом обязательно попробую, но може еще какие варианты подбросите, чтобы завтра не буксовать?
-------------------------------
В истинном золоте блеска нет...
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

XML C8 - не понял...

Сообщение Developer »

Привет всем!


Aragorn писал:
Код работает, файл парсится, но все упирается в кодировку. Завтра буду пробовать предложенный Юрием способ перегона Windows-1251 в UTF-8, а на данный момент могу констатировать следующее.
1. Файл XML в формате Win-1251 гарантированно приводит к AV
2. Даже если файл XML в UTF-8, но в заголовке указано Win1251, AV гарантирован
3. Если файл XML в UTF-8 и в заголовке кодировка не указана, или указана UTF-8, файл парсится, все ноды со всеми значениями и атрибутами заносятся в очередь (которую потом пользует тот самый шаблон ViewXML), но!!!! ВМЕСТО РУССКОГО ТЕКСТА ПОЛНАЯ АБРАКАБАБРА!!! Хотя тот же файл через Internet Explorer, Notepad++. Oxygen и пр.пр.пр. смотрится вполне читаемым! Что не так? Повторюсь, перегнать Win-1251 в UTF-8 предложенным выше способом обязательно попробую, но може еще какие варианты подбросите, чтобы завтра не буксовать?
Полностью согласен с Aragorn-ом что с парсингом XML в Clarion на начальном этапе есть некоторые проблемы пока сам не пройдёшь все этапы и не разберёшься :D

По поводу пункта 3 - так и должно быть :D А не то что ожидаешь :(

Дело в том, что парсер загоняет информацию в очередь из файла XML в той кодировке в которой она существует в исходном виде (именно в кодировке UTF-8) а правильно отображать кириллицу на экран Clarion может только в кодировке Windows CP1251 так как нет поддержки Unicode как например в Embarcadero Delphi - C++ Builder или Microsoft Visual Studio.
Хотя тот же файл через Internet Explorer, Notepad++. Oxygen и пр.пр.пр.
Данные приложения поддерживают Unicode :D

У меня проблема, аналогичная пункту 3 Aragorn-а была когда применял шаблон
iQXML Роберта Пареси http://www.paresi.net/clarion/index.html

Файла XML который был в кодировке UTF-8 - Altova Spy – отображает без проблем а вот в приложении Clarion кириллица абракадаброй (кракозябрами) :(

Моё мнение такое - для профессионалов проблем с парсингом XML на Clarion уже нет - но у них либо свои проверенные решения, либо хорошие платные шаблоны :mrgreen:

А вот новичкам с XML тяжеловато :(

У меня например, файл для парсинга с кодировкой DOS <?xml version = "1.0" encoding="CP866"?> :(

Как и писал Aragorn
ну... вообще-то я стараюсь следовать правилам хорошего тона, которые гласят, что прежде чем задать вопрос, надо воспользоваться поиском... увы, ничего путного не нашел...
В связи с вышеизложенным, прошу продвинутых профессионалов помочь новичкам в вопросе парсинга XML для Clarion и поделиться своими решениями, конечно если это не коммерческий продукт, как например EasyXML :wink:
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

XML C8 - не понял...

Сообщение Дед Пахом »

Если кому очень надо, могу поделиться "триалом" EasyXML, пишите в личку.
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

XML C8 - не понял...

Сообщение Yufil »

Блин, написал большой текст, а Владыка Хаоса его сжевал...
1. Как заменить кодировку Windows-1251 на UTF-8 я уже написал
После замены удобно сразу строку из памяти и парсить, без загрузки в файл

Doc &= XmlStringToDom(CS.S)
If XMLDoc &= Null
Message('Ошибка разборки манифеста ' & Loc:ManifestFileName )
EXIT
End

2. Если тэг с параметрами, параметры надо разобрать отдельно, примерно так

Код: Выделить всё

  <?xml version="1.0" encoding="UTF-8" ?> 
- <structure>
  <program title="Модуль 2. Хранение, передача и публикация цифровой информации" /> 
  <topic level="0" id="ГЛМЕНЮ" name="Главное меню" /> 
  <topic level="0" id="A1" name="Раздел 1" /> 
  <topic level="0" id="A2" name="Раздел 2. Публикация мультимедиаконтента" /> 
  <topic level="0" id="A3" name="Раздел 3" /> 
  <topic level="0" id="A4" name="Раздел 4. Защита информации" /> 
  <topic level="0" id="A5" name="Раздел 5" /> 
  </structure>

ParseTopic     ROUTINE  ! Анализируется строка <topic> и пишется в очередь ManQ
Nl                  &Nodelist,Auto
nnm                 &NamedNodeMap,auto
ANode               &Node,Auto
AttrIndex           Long

                            nnm &= QXML.Node.getAttributes()
                            IF not nnm &= null
                                Loop AttrIndex = 0 to nnm.getLength() - 1
                                    Anode &= nnm.item(AttrIndex)
                                    CS.Set(Anode.GetNodeValue())
                                    CS.ToAscii()
                                    Case lower(ANode.GetNodename())
                                    Of 'level' !               
                                        ManQ:Level = CS.S 
                                    OF 'id' 
                                        ManQ:ID = Clip(CS.S) 
                                    OF 'name' 
                                        ManQ:Name = Clip(CS.S)
                                    END 
                                END     
                                ADD(ManQ) 
                            END 
А если без параметров, надо спуститься строкой ниже и достать значение

Get(QXML,Pointer(QXML)+1) ! Прочитали элемент
CS.Set(ListXML.Node.getNodeValue())
CS.ToAscii()
Loc:Value=CS.S
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

XML C8 - не понял...

Сообщение Игорь Столяров »

Aragorn писал(а): 3. Если файл XML в UTF-8 и в заголовке кодировка не указана, или указана UTF-8, файл парсится, все ноды со всеми значениями и атрибутами заносятся в очередь (которую потом пользует тот самый шаблон ViewXML), но!!!! ВМЕСТО РУССКОГО ТЕКСТА ПОЛНАЯ АБРАКАБАБРА!!!
Ничего не могу сказать про C8, но аналогичная проблема есть при использовании клариновских классов работы с XML в C63.
Тот же самый код собранный в C91 прекрасно загружает русский текст из XML в кодировке UTF-8. Это даже на примерах видно.
Видимо какая-то проблема с обработкой национальных таблиц символов в XML классах C63 ... (и возможно в C8)

Кстати, не все гладко и с русским текстом и в iQXML (при загрузке XML Win-1251), мы одно время переписывались с Robert'ом Paresi
на эту тему, и в общем-то большинство проблем он устранил, но не все. Мы даже из-за этого перестали обновлять библиотеку iqXML,
а потом и полностью от нее отказались ...
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

XML C8 - не понял...

Сообщение Yufil »

Не, в UTF-8 всё загружается без проблем. Одно маленькое НО - возвращаются строки в UTF-8, их надо раскодировать
Ответить