:: Visual Foxpro, Foxpro for DOS
Большой XML
Казакова

Сообщений: 3
Дата регистрации: 10.08.2022
Эпиграф: "Пришла беда откуда не ждали" (А.Гайдар)
Здравствуйте коллеги!
Двадцать лет я тихо мирно сидела на КЛАДР. Внезапно ФСС с переходом на систему "Прямых выплат" потребовал в "Сведениях о застрахованных лицах" указывать код ФИАС. ФНС распространяет систему ГАР ФИАС исключительно в формате XML.
До этого я прекрасно переводила XML в DBF с помощью класса XMLAdapter, тем более ФНС дает в придачу схемы XSD, но файлы ГАР ФИАС оказались очень тяжелы для VFP 9. Пока размер XML-документа не превышаем 400 мБ, парсинг "идет как по маслу", но стоит попытаться обработать файл потяжелее выходит ошибка: "XML Error: XM: Parse error: Недостаточно ресурсов памяти для завершения операции Line 1, Position 2034". Функция XMLtoCursor() выдает это же системное сообщение. Сделала попытку использовать MSXML2.DomDocument.4.0, результат аналогичный до 400 мБ все замечательно, после: "Error - 2147024882", то есть насколько я понимаю по ангельски английски "Недостаточно места для этой операции". И ОЗУ ПК не причем, пробовала и на 4 гБ, и на 8 гБ.
Сейчас приходится "разрывать" большие XML "руками", с помощью "FirstObject XML Editor" на файлики до 400 мБ, пакетом обрабатывать и получившиеся курсоры грузить на сервер МуSQL для дальнейшего использования, дальше с информацией на сервере проблем не возникает.
ФНС грозиться в следующем году прекратить обновление КЛАДР. Может кто-то нашел более креативное решение для данной проблемы, один раз конечно можно тихо матерясь переколотить данные нескольких регионов руками, но это как-то не рационально


------------------
Ratings: 0 negative/0 positive
Re: Большой XML
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
А сразу в MySql распарсить.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Большой XML
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Казакова
Сейчас приходится "разрывать" большие XML "руками", с помощью "FirstObject XML Editor" на файлики до 400 мБ, пакетом обрабатывать и получившиеся курсоры грузить на сервер МуSQL для дальнейшего использования, дальше с информацией на сервере проблем не возникает.
ФНС грозиться в следующем году прекратить обновление КЛАДР. Может кто-то нашел более креативное решение для данной проблемы, один раз конечно можно тихо матерясь переколотить данные нескольких регионов руками, но это как-то не рационально
А почему нельзя один раз написать программку на Фоксе, разбивающую текстовый файл на части допустимого размера, а далее каждую часть той же программкой "прекрасно переводить в DBF с помощью класса XMLAdapter"?
Ratings: 0 negative/0 positive
Re: Большой XML
Казакова

Сообщений: 3
Дата регистрации: 10.08.2022
PaulWist
А сразу в MySql распарсить.
Рецепт в студию.
Ratings: 0 negative/0 positive
Re: Большой XML
Казакова

Сообщений: 3
Дата регистрации: 10.08.2022
akvvohinc
Казакова
Сейчас приходится "разрывать" большие XML "руками", с помощью "FirstObject XML Editor" на файлики до 400 мБ, пакетом обрабатывать и получившиеся курсоры грузить на сервер МуSQL для дальнейшего использования, дальше с информацией на сервере проблем не возникает.
ФНС грозиться в следующем году прекратить обновление КЛАДР. Может кто-то нашел более креативное решение для данной проблемы, один раз конечно можно тихо матерясь переколотить данные нескольких регионов руками, но это как-то не рационально
А почему нельзя один раз написать программку на Фоксе, разбивающую текстовый файл на части допустимого размера, а далее каждую часть той же программкой "прекрасно переводить в DBF с помощью класса XMLAdapter"?
Подскажите как не вижу рецепта. Если Вы предполагаете использование конструкции INSERT INTO &LODBF values(STREXTRACT(stroka,"<",">")), то нужно предварительно разбить файл на строки, методом подстановки CHR(13) между тэгами, у меня из подходящего инструментария только редактор AkelPad, но и ему гектарный файл "не по зубам". Кстати после этого класс XMLAdapter использовать будет невозможно, придется расписывать конкретное распознание. Лисичка меня кормит с 1994 года, как говорится: "Моя пропадала везде"



Исправлено 1 раз(а). Последнее : Казакова, 11.08.22 04:40
Ratings: 0 negative/0 positive
Re: Большой XML
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Казакова
PaulWist
А сразу в MySql распарсить.
Рецепт в студию.

stackoverflow-com.translate.goog

stackoverflow.com

www.google.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Большой XML
dimag

Сообщений: 464
Откуда: Одинцово
Дата регистрации: 17.12.2002
Казакова
PaulWist
А сразу в MySql распарсить.
Рецепт в студию.

Все уже сделано за нас: Загрузка ФИАС в БД на MSSQLSERVER подручными (SQLXMLBULKLOAD) средствами habr.com


------------------
Глупость - это не отсутствие ума, это такой ум.
Ratings: 0 negative/0 positive
Re: Большой XML
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
dimag
Казакова
PaulWist
А сразу в MySql распарсить.
Рецепт в студию.

Все уже сделано за нас: Загрузка ФИАС в БД на MSSQLSERVER подручными (SQLXMLBULKLOAD) средствами habr.com

Это не MySql


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Большой XML
akvvohinc

Сообщений: 4203
Откуда: Москва
Дата регистрации: 11.11.2008
Казакова
Подскажите как не вижу рецепта. Если Вы предполагаете использование конструкции INSERT INTO &LODBF values(STREXTRACT(stroka,"<",">")), то нужно предварительно разбить файл на строки, методом подстановки CHR(13) между тэгами

Нет.
Программа должна просто разбить один большой XML на несколько XML файлов, которые будут иметь размер, нормально обрабатываемый XML-адаптером.
То есть она сделает то же самое, что вы делали руками с помощью FirstObject XML Editor, если я правильно понял.

Для примера я скачал файл AS_HOUSES.xml, посмотрел структуру
<?xml version="1.0" encoding="utf-8"?>
<HOUSES>

<HOUSE параметры />
...

</HOUSES>

Допустим, он очень большой и надо разбить его на несколько файлов подходящего для дальнейшей обработки размера.
Каждая часть должна иметь ту же структуру, но количество записей <HOUSE параметры /> в ней должно быть уменьшено, чтобы часть в целом не превышала ваш максимальный размер.

Работаете с XML-файлом функциями низкого уровня (FOPEN() и т.п).

Читаете в цикле файл функцией FREAD() кусками максимального допустимого размера и пишете выходные файлы функцией FWRITE().

Каждая часть должна состоять из:
1) заголовка
<?xml version="1.0" encoding="utf-8"?>
<HOUSES>

2) записей <HOUSE параметры />
3) футера </HOUSES>

Поэтому сразу пишете стандартный заголовок.
Затем в цикле читаете исходный файл, начиная с первой записи <HOUSE параметры />, кусками максимального допустимого размера (кажется, это 65 Kb), проверяя на каждом проходе общий размер генерируемой части на тот максимум, который может обработать XMLAdapter.
Если очередная порция не может быть записана в выходной файл целиком, то находите в ней конец текущей записи <HOUSE параметры /> (ведь предыдущий кусок мог закончиться где-то в середине записи), дописываете его, а затем и футер - получили первую (очередную) часть исходного XML.

Затем подобным же образом формируете следующую часть, не забывая после заголовка сначала записать остаток предыдущего прочитанного куска исходного файла.

И так далее, пока исходный файл не кончится.

На выходе вы получаете вместо одного большого XML несколько нормальных правильных XML - HOUSE_001.xml, HOUSE_002.xml и т.д.

Все прочие XML-файлы (а их по 18 в каждой папке) имеют аналогичную структуру:
<ITEMS> <ITEM /> </ITEMS>
<ROOMS> <ROOM /> </ROOMS>
и т.д.
а значит, программа может быть универсальной и автоматически обрабатывать любой из них, основываясь на имени второго тега (HOUSES, ITEMS, ROOMS и т.д.).

В принципе алгоритм чтения исходного файла может быть и другим, но предложенный, я полагаю, будет наиболее быстрым.



Исправлено 7 раз(а). Последнее : akvvohinc, 12.08.22 01:27
Ratings: 0 negative/0 positive
Re: Большой XML
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> указывать код ФИАС. ФНС распространяет систему ГАР ФИАС исключительно в формате XML.
Ничего не сделаете результативного с XML штатным образом (преобразованием в DOM)

Если в VFP, то только только рукопашное распарсивание (поиск тэгов в буфере, при линейном чтении), или использование не DOM-обьекта всего XML, а последовательное чтение тэгов, виндовый XMPHTTP-обьект это умеет, есть упоминание на этом форуме (забыл название этого механизма... Эх! не ИК!)

() Если принять многогиговый ФИАС может 1С, то флаг ему в руки. Я просто скачать не смог полный ФИАС...

() изобретателей формата ФМАС - в топку



Исправлено 1 раз(а). Последнее : of63, 13.08.22 19:06
Ratings: 0 negative/0 positive


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

On-line: 67 OlegA  (Гостей: 66)

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