:: Visual Foxpro, Foxpro for DOS
Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Добрый день коллеги!
Кто нибудь уже решал (решил) задачу импорта больничных листов их XML - файлов в Fox-е?
Там вроде ничего сложного, но что делать с
<?xml version="1.0" encoding="UTF-8"?>



Исправлено 2 раз(а). Последнее : FoxShip, 12.04.18 12:35
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
FoxShip
но что делать с
<?xml version="1.0" encoding="UTF-8"?>
А почему решил, что с этим таки надо что-то делать?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Не пробовал конечно, но почему то решил, что файловые функции низкого уровня не поймут исходный файла в кодировке UTF-8 в программе работающей с Win1251.
Может я чего то недопер?
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
STRCONV(<строка>,9) подойдет?
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
полагаю STRCONV(..., 11)



Исправлено 1 раз(а). Последнее : AndyNigmatec, 12.04.18 13:08
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
FoxShip
Не пробовал конечно, но почему то решил, что файловые функции низкого уровня не поймут исходный файла в кодировке UTF-8 в программе работающей с Win1251.
Может я чего то недопер?

На "низком уровне" по сути нет "кодировки". Т.е. считывается например строка байтов. С которой можно делать почти что хочешь.
Перекодировка же нужна только уже при работе с данными этой строки в самом Фокспро.
Кстати не обязательно использовать в таких случаях обязательно считывание на низком уровне. Особенно, если в файле XML нет разбивки по строкам. Можно например использовать FILETOSTR() для считывания целиком в переменную.
Далее остается только написать свою разборку по тэгам - для вытаскивания нужной информации из них. Для чего открыть параллельно с фоксом XML в любом подходящем редакторе, ну или хотя бы в окне просмотра через браузер IE, и зная из вида формы той программы, откуда взят XML - где что находится, найти внутри каких открывающих-закрывающих тэгов что расположено. Ну и написать соответствие.
Также есть и еще более простой способ, который я применял еще в FPD.
Т.к. в XML не было разделителей строк, вначале пропускал через блок функций низкого уровня, считывал все данные в новый текстовый файл, заменяя все сочетания "><" на ">"+CHR(10)+CHR(13)+"<". После чего создавал временную таблицу с символьным полем длиной 254. И через APPEND FROM SDF - добавлял текстовый файл. Получалась очень легко обрабатываемая таблица, в каждой строке которой данные конкретных тэгов.
Ну далее использовал самописный перекодировщик для UTF-8 - ASCII. В VFP разумеется есть готовая функция. После чего пользователь правил что надо или распечатывал. А при необходимости, было дело, даже экспортировал снова в XML (ну потом это уже стало не нужным).
Т.е., главное считать, а дальше уже можно, переконвертировав, делать все, что нужно.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Я с xml считывал (по образцу с форума кстати) через
xmlDoc = CreateObject("Msxml.DOMDocument")

особых тормозов не заметил ... 2-5 тыс.записей таким образом забирал - единицы секунд занимало, но ежели таких импортов 100500 - то вопрос производительности встанет думаю
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
FoxShip
но что делать с
<?xml version="1.0" encoding="UTF-8"?>

Ничего не делать. Если данные в файле ДЕЙСТВИТЕЛЬНО в кодировке UTF8, адекватный парсер без проблем их прочитает и правильно раскодирует.
Тот же Msxml2.DOMDocument всё сам адекватно раскодирует - и UTF8 и всякие кавычки, амперсанты, угловые скобки... Чтобы в текстах были символы, а не всякие &gt;
Если структура достаточно простая и не шибко вложено-вложенная, то можно даже настроить XMLAdapter для автоматизированного получения курсоров из такого файла. Примеров на форуме хватает.

Конечно же если идти по пути криспы и делать свой самодельный парсер - хоть на FREAD хоть на FILETOSTR или APPEND MEMO то это будет ТВОЯ головная боль - все эти кодировки, entities, корректный разбор самой структуры - где тег, где атрибут, где CDATA, namespace те же... Потому так делать я крайне не рекомендую.

Если эти файлы будут реально гигантскими (размером в десятки Мб), то вместо DOM парсера придётся применять SAX вариант. DOM грузит всё содержимое XML в память, при том в "разборанном" виде - как куча объектов с не меньшей кучей свойств - потому ему банально не будет хватать памяти для обработки гигантских XML-ей.
SAX парсер - по сути это "читальщик" содержимого, генерирующий специальные "события" как только в процессе чтения происходит то или иное изменение контекста - вход в элемент, выход из него, чтение атрибута, чтение содержимого и т.д. Работа в таком режиме весьма своеобразна, зато не будет проблем даже с терабайтными файлами


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Спасибо что поставили на путь истинный.



Исправлено 2 раз(а). Последнее : FoxShip, 12.04.18 14:41
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Попытался получить с помощью XMLAdapter сразу при чтении файла вылетела ошибка.
Он без XSD видимо не работает. А XSD у меня нет.
Придется разбирать Msxml2.DOMDocument.
Но что-то примеров пока не могу.
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну вот буквально недавно как примерчик forum.foxclub.ru
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
По ссылке дан пример
SET safety off
*** это тот кусочек который не работает
....
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
я лично там по ссылке выкладывал 100% работающий пример ... не скажу что по феншую сделан - но рабочий )))
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Ок! Поехали!
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Все прекрасно работает - спасибо всем!
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
FoxShip
Попытался получить с помощью XMLAdapter сразу при чтении файла вылетела ошибка.
Он без XSD видимо не работает. А XSD у меня нет.
Он далеко и не со всякой схемой XSD сможет САМ разборать иерархический по сути XML в "плоские" курсоры. "Вручную" создавая нужные XMLTables/XMLFields и прописывая им свойства можно разбирать уже гораздо большее разнообразие xml документов - но тоже далеко не все...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
У меня простая схема. Больничные - куда уж проще?
Обошелся с MSXML2.DOMDocument. Все закачалось.
Попробовал сначала программу Advanced XML Converter. Не понравилось.
Все заливает в один файл (dbf, xls, ...), хотя, если нет желания разбираться с MSXML2.DOMDocument или XMLAdapter,
вполне можно воспользоваться. В каком то проекте я уже делал так.
Решил все же разобраться с MSXML2.DOMDocument. Для моих нужд оказалось проще чем я думал.



Исправлено 1 раз(а). Последнее : FoxShip, 14.04.18 08:36
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Поскольку примера этого самого больничного-xml приведено не было, судить о том "проще некуда" он, или достаточно неудобный для фокса (не "табличный" документ) - невозможно. Равно как и посоветовать тот или иной подход к его разбору. Т.к. XMLAdapter проще в одних случаях, а достаточно "многословный" код с циклами по объектам/коллекциям MSXML2.DomDocument - будет лучше в других...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
FoxShip
Автор

Сообщений: 458
Дата регистрации: 27.06.2007
Вы, как всегда, правы.
Но результат, с помощью форума в том числе, достигнут, а на мою "философию" обращать внимания не стоит.
Тут люди достаточно грамотные чтобы самим разобраться что и когда применить без моих рассуждений.
Ratings: 0 negative/0 positive
Re: Импорт больничных листов их XML - файла.
dafni_2004

Сообщений: 89
Дата регистрации: 17.11.2005
решение можно в студию?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 18 (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика