Как разделить xml файл на части
Перейти к содержимому

Как разделить xml файл на части

  • автор:

Разбить XML файл на несколько частей.

Есть что-то готовое для резки XML (хотя с трудом представляю как. ) на части. Мне надо распилить файл где-то на 20 частей.

Suntechnic ★★★★★
26.11.13 02:12:45 MSK

По каким критериям резать? Надо ли на выходе получать well-formed/valid XML?

Скорее всего, кури XPath и XSLT.

anonymous
( 26.11.13 02:16:44 MSK )

есть многое на свете, друг горацио, что и не снилось нашим мудрецам

chg ★★★★★
( 26.11.13 02:28:45 MSK )

xmllint —help | grep xpath; xslt

visual ★★★
( 26.11.13 02:36:13 MSK )
Последнее исправление: visual 26.11.13 02:36:24 MSK (всего исправлений: 1)

Ответ на: комментарий от anonymous 26.11.13 02:16:44 MSK

Надо ли на выходе получать well-formed/valid XML?

Да. Допустим порезать между тегами 2 уровня вложенности.

Suntechnic ★★★★★
( 26.11.13 02:50:14 MSK ) автор топика
Ответ на: комментарий от Suntechnic 26.11.13 02:50:14 MSK

Подозреваю тебе прийдется сделать это «аналитически». Используя любую библиотеку считывать, зная формат определять в место разрыва (зная формат его можно определить), например если дерево двухуровневое, можно складывать ~50% тегов в один файл и 50% в другой, дублируя корень. Не думаю что есть универсальный инструмент для такого. Это же как резать без рентгена.

trashymichael ★★★
( 26.11.13 10:07:14 MSK )
Ответ на: комментарий от trashymichael 26.11.13 10:07:14 MSK

Ну в итоге я так и сделал. Просто думал возможно есть инструмент.

Как разделить xml файл на части

Argument ‘Topic id’ is null or empty

Сейчас на форуме

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

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

ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

Как разделить xml файл на части

Подскажите, если простой способ и XML примерно такого вида:

Элемент1 = » . куча вложенных узлов . «;
Элемент2 = » . куча вложенных узлов . «;

можно попробовать сделать xsd-схему. )
(1) И?
(0) Для нафига?

ДомДокумент = Новый COMОбъект(«Msxml2.DOMDocument.6.0»);

ВыбранныеУзлы = ДомДокумент.SelectNodes(«/Root/Item/»);
Для Инд = 0 По ВыбранныеУзлы.Length — 1 Цикл
ТекУзел = ВыбранныеУзлы.Item(Инд);
.
КонецЦикла;

У ТекУзел будет свойство XML — где будет содержимое всего этого узла.

(2) Пытаюсь обойти баг

Фабрика = СоздатьФабрикуXDTO(Схема);
ХМЛ = Новый ЧтениеXML;
ХМЛ.ОткрытьФайл(Файл);

Пока ХМЛ.Прочитать() Цикл
Если ХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ХМЛ.Имя = «item» Тогда
Элемент = Фабрика.ПрочитатьXML(ХМЛ,ЭлементТип);
КонецЕсли;
КонецЦикла;

Фабрика.ПрочитатьXML скидывает текущую позицию ЧтенияXML на первый подчиненный узел СЛЕДУЮЩЕГО item-а. А не на его «начало элемента», как можно было бы ожидать.

Как разделить большой xml-файл размеров 1 гб на множество по 20 мб?

Мне дали большой xml-файл, который мне требуется импортировать на сайт, но компонент отвечающий за импорт принимает только файлы меньше 20 МБ. Можно ли с помощью алгоритма на python из одного большого xml-файла достать все данные и равномерно распределить на множество небольших по 20 и меньше мегабайт? Под «равномерно распределить» я имею ввиду что бы файл заканчивался на и в один файл не попадал и его дочерние элементы из другого файла. Каждый блок весит от силы полмегабайта-мегабайт. Пример одного блока в файле:

   path/to/img1.jpg path/to/img2.jpg path/to/img3.jpg  <item>Название</item>  Около 50-100 строк html кода  Product weight: 1.2 kg Package weight: 1.3 kg   

Отслеживать
задан 7 авг 2019 в 16:32
471 1 1 золотой знак 6 6 серебряных знаков 13 13 бронзовых знаков
У вас есть агрантия, что любой блок в этом XML не больше 20мб?
7 авг 2019 в 16:47

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

from lxml import etree data = """  path/to/img1.jpg path/to/img2.jpg path/to/img3.jpg  <item>Название</item>  Около 50-100 строк html кода  Product weight: 1.2 kg Package weight: 1.3 kg   """ data = data*3 # Для пример будет 3 одинаковых дерева class Saver: name = '/путь/к/название_файла_<>.xml' # Скобки '<>' - место для счетчика. start_id = 0 nblocks = 2 # ' # Т.к. у нас получается битый xml (множество одинаковых тегов в корне) parsed = etree.fromstring(data).findall('root') saver = Saver() for i in parsed: saver(etree.tostring(i, encoding='unicode')) del saver # Это удаляет объект saver и сохраняет последний файл. 

Не забудь убрать: data = data*3 При проблемах с кодировкой на Windows, замените ‘w’ на ‘ab’ в open и удалите encoding=’unicode’ из tostring .

Отслеживать
ответ дан 7 авг 2019 в 19:57
Anton Abrosimov Anton Abrosimov
2,233 9 9 серебряных знаков 26 26 бронзовых знаков
Комментарии не предназначены для расширенной дискуссии; разговор перемещён в чат.
7 авг 2019 в 21:44

Имя файла подкорректировал? name = ‘/tmp/блок_<>.xml’ ? Скобки <> в нем есть? Воткни print(name) после f.write(self._cur_block_str) и посмотри, куда запись идет. nblocks = 2 — количество блоков на один файл не слишком большое?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *