Ответы пользователя по тегу XML
  • Как найти ошибку в XML файле?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Читайте внимательно, в сообщении об ошибке у вас написано, что тег description должен быть простым и не должен содержать дочерних тегов, а у вас не так. Причем везде.
    <description>![CDATA[Матрас VIRGINIA Black&White MultiPack, Средней/Мягкой жесткости, высота 230 мм
          
          <strong>Состав:</strong>
          <ul>
            <li>Латекс перфорированный - 30 мм</li>
            <li>Кокос латексированный - 10 мм</li>
            <li>Термовойлок</li>
            <li>Блок независимых пружин Multi Pocket - 512 пружин/м²</li>
            <li>Термовойлок</li>
            <li>Пена с эффектом памяти (мемориформ) - 40 мм</li>
            <li>Короб из ППУ</li>
          </ul>
          <strong>Чехол:</strong> Трикотаж Black&White простеган на синтепоне.
          
          <b>Особенности матраса:</b>
          <ul>
            <li><span style="text-decoration: underline;">Термовойлок</span>, плотный и упругий материал, отлично изолирует пружинный блок от верхних слоёв матраса. Использование термовойлока обеспечивает более равномерное распределение давления пружин на тело, увеличивает комфорт и продлевает срок эксплуатации матраса.</li>
            <li><span style="text-decoration: underline;">Multi Pocket (мультипакет</span>) это блок с увеличенным (512 на 1 м²) ) числом независимых пружин. Они отличаются меньшим диаметром и, благодаря своей плотности, обеспечивают повышенную комфортность для спящего человека. Используется в матрасах, рекомендованных для людей с большим весом.</li>
            <li><span style="text-decoration: underline;">Кокосовое волокно</span> один из самых натуральных, экологичных и долговечных материалов. Кокосовое волокно не подвержено гниению, не вызывает аллергии, отлично вентилируется и не впитывает запахи. Используется для жёсткости и равномерному распределению веса на пружинный блок.</li>
            <li><span style="text-decoration: underline;">Перфорированный латекс</span> это замечательный материал, обладает гипоаллергенными свойствами и не допустит развития бактерий, которые смогут вызвать аллергию или нанести какой-то вред телу. Он не впитывает запахи и влагу. Пористая структура прекрасно «дышит» — влага, попавшая внутрь, тут же испаряется.</li>
            <li><span style="text-decoration: underline;">«Memory Foam» (мемориформ</span>) или «пена с эффектом памяти» – новое поколение эластичных наполнителей для матрасов. Тонко реагируют на нагрузку и тепло, создают ощущение невесомости во время отдыха, отсутствие ответного давления на тело и деликатная поддержка физиологических изгибов позвоночника, не подвержены биопоражениям, гипоаллергенный, отличная вентиляция спального места, гарантирует спокойный сон, долговечность, не накапливает пыль.</li>
            <li><span style="text-decoration: underline;">Чехол</span> собран из трикотажа, приятного на ощупь и имеющего дышащий эффект для проветривания и циркуляции воздуха внутри матраса. Чехол простеган на синтепоне, что делает его более мягким и долговечным.</li>
            <li><span style="text-decoration: underline;">Короб ППУ(пенополиуретановый</span>). Для сохранения внешнего вида матраса правильной формы по периметру матраса используется короб из пенополиуретана.</li>
          </ul>
          <strong>Характеристики</strong>
          <ul>
            <li>Производитель: ООО ТПФ Текса</li>
            <li>Страна производитель: Россия</li>
            <li>Материал наполнения: ППУ, Кокос, Латекс, Мемориформ, Термовойлок</li>
            <li>Пружинный блок: Независимый пружинный блок <span style="text-decoration: underline;">Multi Pocket</span></li>
            <li>Высота: 23 см</li>
            <li>Жесткость: Средняя/Мягкая</li>
            <li>Вес на спальное место: до 140 кг</li>
            <li>Сертификат: EAC</li>
            <li>Гарантия: 18 мес.</li>
          </ul>]]</description>
    Ответ написан
    Комментировать
  • Как посчитать количество суб-объектов в Python для каждого XML-объекта?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете сделать это за два прохода.
    На первом проходе просто собираете множество всех возможных уникальных тегов. Я бы просто записывал в словарь True по ключу, равному имени каждого попавшегося тега на первом проходе.
    В результате вы получите словарь уникальными именами в ключах, причем эти ключи будут в том порядке, в каком они встречались в XML (иногда это просто удобно, что они не в рандомном порядке).
    Имея общий набор имён вы можете воспользоваться стандартным способом записи в CSV в виде словарей.
    Останется лишь конвертировать каждый узел из вашего файла в словарь. Никаких сторонних библиотек не нужно.
    Ответ написан
    1 комментарий
  • Как сделать быстрый парсинг XML и запись в базу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Прологируйте подробно вашу функцию и вы поймёте что больше тормозит.
    Основных проблемы может быть три:
    1) Долгий парсинг XML. Его время зависит от размера файла, а вставлять в базу вы начнете только по окончании парсинга. При этом весь файл в виде объектного дерева у вас будет в памяти. что может быть очень неэффективно.
    2) Долгий поиск нужных элементов в дереве. Это сомнительно, что он тут будет существенно тормозить на фоне прочих процессов.
    3) Долгая вставка из-за отдельных транзакций на каждую.

    1,2) Первая проблема может быть решена потоковым чтением XML через SAX-парсер. На закрытие определенных тегов вешаются события, а объект-парсер накапливает данные в своём состоянии. Это позволит получать данные по мере чтения и парсинга файла, а не после. Вторая проблема, кстати, то же решается sax-парсером. Просто не будет дополнительных накладных расходов на обход построенного парсером дерева.

    3) Можно попробовать cursor.executescript для пакетного исполнения запросов. Тут есть минус, нужно валидацию и экранирование данных делать руками и правильно. нужно бояться sql-инъекций.
    Лучше использовать cursor.executemany. Вот, например про это на стэковерфлов: https://stackoverflow.com/questions/18244565/how-c...
    Ответ написан
    Комментировать