Разместите свой проект бесплатно и начните получать предложения от фрилансеров-исполнителей уже спустя минуты после публикации!

Сделать скрипт, анализирующий XML и удалящий лишние блоки

истекло время актуальности


Нужно сделать скрипт который анализирует заданный xml и удаляет из него лишние узлы.

Узлы - все что между <item></item>. Лишние узлы - все, внутри которых есть строка <available></available>. В узлах, которые нужно оставить, эта строка выглядит так -  <available>true</available>.

Язык программирования не важен. Прайс состоит из примерно 300 тыс. строк, поэтому скорость выполнения важна. 


Пример файла, который нужно обработать:

<?xml version="1.0" encoding="UTF-8"?>

<price>

    <items>

            <item id="000010709_0" group_id="06460" parent="true">

            <name><![CDATA[Best Glutamine (400 g)]]></name>

            <categoryId>10</categoryId>

            <vendor><![CDATA[BPI sports]]></vendor>

            <country><![CDATA[США]]></country>

            <vendorCode>06460</vendorCode>

            <currencyId>USD</currencyId>

            <price>18.72</price>

            <available></available>

            <promotion>false</promotion>

            <newProduct>false</newProduct>

            <param name="Фасовка/размер"><![CDATA[400 g]]></param>

        </item>

        <item id="000010709" group_id="06460">

            <name><![CDATA[Best Glutamine (400 g, snow cone)]]></name>

            <categoryId>10</categoryId>

            <vendor><![CDATA[BPI sports]]></vendor>

            <country><![CDATA[США]]></country>

            <vendorCode>06460-04</vendorCode>

            <currencyId>USD</currencyId>

            <price>18.72</price>

            <available>true</available>

            <promotion>false</promotion>

            <newProduct>false</newProduct>

            <param name="Фасовка/размер"><![CDATA[400 g]]></param>

            <param name="Вкус/цвет"><![CDATA[snow cone]]></param>

            <warehouses>

                <warehouse id="1">

                    <name>Киев</name>

                    <available>true</available>

                </warehouse>

                <warehouse id="2">

                    <name>Кременчуг</name>

                    <available>false</available>

                </warehouse>

            </warehouses>

            </item>

        </items>

</price>



  1. 3 дня1 000 ₴
    Володимир
    Володимир Соколов
    1439     81  2   5

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

    Украина Львов | 15 августа в 18:23 |
  2. 2 дня1 300 ₽
    Andrey
    Andrey Evsyukov
    192     5  0

    Добрый день, готов выполнить данную задачу, стоимость - 1300, срок 1 день, (указываю 2 для необходимых правок), реализую на python. Пишите, буду рад сотрудничетсву

    Россия Москва | 15 августа в 18:26 |
  3. 2 дня3 000 ₽
    Роман
    Роман Ефименко
    1777     59  0   1

    Здравствуйте.

    Могу предложить реализацию как веб-приложение. Если задача разовая, могу также предложить выполнить на выделенном сервере.

    Россия Краснодар | 15 августа в 18:32 |
  4. 1 день400 ₴
    Вадим
    Вадим Молочников
    433     8  1

    Здравствуйте. Сделаю вашу работу. Могу приступить сейчас же.

    Украина Житомир | 15 августа в 18:39 |
  5. 1 день800 ₴
    Дмитрий
    Дмитрий Рябков
    1582   проверен    19  0

    Здравствуйте. Готов выполнить в лучшем виде обращайтесь. Предоставьте файл возможно смогу предоставить решение.

    Украина Сумы | 15 августа в 19:21 |
  6. 1 день400 ₴
    Владислав
    Владислав Новгородов
    3406   проверен    83  0

    Добрый день. Если нужно разово проделать эту операцию - то могу сделать за 400 грн. Если нужен скрипт, то могу написать программу под Windows - стоимость будет 800 грн.

    Украина Киев | 15 августа в 19:47 |
  7. 829
       15  0

    1 день1 500 ₴

    Добрый день
    сделаю скрипт на пхп, опыт огромный
    работать на хостинге либо на локальном сервере на компе

    Украина Северодонецк | 15 августа в 20:32 |
  8. 3 дня350 ₴
    Иван
    Иван Седов
    217   

    Здравствуйте, с заданием ознакомился, готов выполнить, работать будет точно и быстро. Язык Python 3. Есть один вопрос: есть тэг available в item, а есть тэг available глубже, например в , проверять только в item или на всю глубину дерева?

    Россия Екатеринбург | 15 августа в 21:44 |
  9. 2 дня500 ₴
    Олександр
    Олександр Купрій
    518     6  1

    Здраствуйте, Андрей.
    Без лишних разговоров, сделаю Вам скрипт, который будет выполнять Вашу задачу и Вы сможете в нём указать размещение файла. Я думаю большего Вам и не нужно. Будет работать чётко и быстро, а главное не потребуется много времени на разработку и стоить будет не дорого.
    Если хотите обсудить детали - пишите в личные сообщения или в телеграмм @sasha_kuprii.
    Буду рад сотрудничать.
    С уважениям, Александр

    Украина Киев | 17 августа в 23:06 |
  10.  фрилансер больше не работает на сервисе
  11. 2 дня300 ₴
    Евгений
    Евгений Фролов
    204   

    Сделаю программу на golang за 1 день + день на возможные правки если таковые будут.
    OS: windows/linux

    Россия Стрежевой | 21 августа в 08:08 |
  12. 3 дня1 000 ₴
    Сергій
    Сергій Чоповський
    177     1  1

    Доброго дня, Андрію

    Напишу скрипт на Python'і

    Термін:
    3 дні (можливо й раніше)

    Якщо вам потрібен ще якийсь функціонал до даного скрипта, - пишіть, обговоримо подробиці

    Буде добре, якщо ви надасте мені або сам XML-файл, або ж, хоча б деяку його частину, - щоб я бачив усі можливі варіанти розташування вузлів, які можуть трапитись у даному файлі

    Напишіть мені в особисті повідомлення на цьому сайті, щоб ми з вами могли швидше вирішити вашу задачу

    Украина Кропивницкий (Кировоград) | 20 августа в 17:31 |
  • Дмитрий Федотов
    15 августа в 18:19 |

    Добрый день, уточните пожалуйста, по сути вам надо удалить узел avaliable?

  • Дмитрий Федотов
    15 августа в 18:20 |

    Извеняюсь, вопрос закрыт, невнимательно прочитал

  • Андрій Тимченко
    15 августа в 18:21 |

    Notepad++ и регулярка.

  • Андрей Каламайко — заказчик проекта
    15 августа в 19:47 |

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

  • Леонид Бабенко
    15 августа в 18:22 |

    А что мешает открыть в любом текстовом редакторе и сделаейте массовую замену "<available></available>" на ""

  • Роман Ефименко
    15 августа в 18:30 |

    Полагаю, что это мешает сделать исходная задача.

  • Леонид Бабенко
    15 августа в 18:33 |

    вам виднее, но по приложенному кусочку файла не вижу припятствий.

  • Роман Ефименко
    15 августа в 18:35 |

    Нужно сделать скрипт который анализирует заданный xml и удаляет из него лишние узлы

    Т.е. в регулярке должна быть обработка всего item. Можно конечно и в одном выражении описать, но это уже из разряда челенджей.

  • Леонид Бабенко
    15 августа в 18:42 |

    Все я понял, вчитался и разобрался. Да, простая замена не катит. Сори. Мог бы взяться и сделать вам утилитку, но до понедельника занят.

  • Андрей Каламайко — заказчик проекта
    15 августа в 19:49 |

    Время терпит, потому если возможность - милости прошу делать ставку.

  • Александр М.
    15 августа в 18:54 |

    Андрей, Вам разово нужно выполнить очистку файла на 300к строк ?

    Или Вам нужен скрипт, который будет удалять эти блоки <item></item> - по заданному условию ?

  • Андрей Каламайко — заказчик проекта
    15 августа в 19:52 |

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

  • Дмитрий Славинский
    15 августа в 23:03 |

    Здраствуйте! Есть вопросы по поводу сотрудничества!Работает ли магазин по системе Дропшиппинг? И можем ли мы продавать Ваш товар на маркетплейсе Розетка?

    068-059-08-20
    [email protected]

  • free web
    16 августа в 06:44 |

    Добрый день !


    Есть веб-приложение формирования файла XML розетки. 

    Импорт XLS CSV XML -> XML-розетки.  Есть версия и для прома. 

    XML-прома -> XML-розетки. Детально пишите в личку. 

    Вышлите ваш прайс или ссылку для скачивания.

    У вас выделенный сервер или простой хостинг ?


    В Демо-примере не работает профиль админа

    http://xv.kl.com.ua/market/admin.php

    логин = admin

    пароль = rozetka


  • Роман Код
    16 августа в 22:48 |

    Вот регулярка:
    <item[\s>](.|\r|\n)*?<available></available>(.|\r|\n)*?</item>
    Она ищет то, что вам не нужно. Заменить на "пусто" дело техники в любом редакторе или на любом ЯП в 1-5 строк.
    Можете отблагодарить небольшой суммой, не откажусь. )
    Также огу помочь и в автоматизации сего процесса.

  • Роман Ефименко
    16 августа в 22:50 |

    Вы ее хотя бы попробовали?

  • Роман Код
    16 августа в 22:59 |

    Да, есть там косяк. Сейчас поправлю.

  • Роман Код
    17 августа в 16:24 |

    Сделал я частично и чистой регуляркой, но там дикий ужас на пол страниці.
    Проблема в том, что нужно сотворить паттерн "вібрать все, кроме слова", а в регулярках с этим туговато.
    Ну вот такой вариант на РНР, вначале ваш файл, потом пару строк кода (могу сделать на любом языыке):
    <?php

    $txt = '
    <?xml version="1.0" encoding="UTF-8"?>

    <price>

    <items>


    <item id="000010709" group_id="06460">

    <name><![CDATA[Best Glutamine (400 g, snow cone)]]></name>

    <categoryId>10</categoryId>

    <vendor><![CDATA[BPI sports]]></vendor>

    <country><![CDATA[США]]></country>

    <vendorCode>06460-04</vendorCode>

    <currencyId>USD</currencyId>

    <price>18.72</price>

    <available>true</available>

    <promotion>false</promotion>

    <newProduct>false</newProduct>

    <param name="Фасовка/размер"><![CDATA[400 g]]></param>

    <param name="Вкус/цвет"><![CDATA[snow cone]]></param>

    <warehouses>

    <warehouse id="1">

    <name>Киев</name>

    <available>true</available>

    </warehouse>

    <warehouse id="2">

    <name>Кременчуг</name>

    <available>false</available>

    </warehouse>

    </warehouses>

    </item>


    <item id="000010709_0" group_id="06460" parent="true">

    <name><![CDATA[Best Glutamine (400 g)]]></name>

    <categoryId>10</categoryId>

    <vendor><![CDATA[BPI sports]]></vendor>

    <country><![CDATA[США]]></country>

    <vendorCode>06460</vendorCode>

    <currencyId>USD</currencyId>

    <price>18.72</price>

    <available></available>

    <promotion>false</promotion>

    <newProduct>false</newProduct>

    <param name="Фасовка/размер"><![CDATA[400 g]]></param>

    </item>

    <item id="000010709" group_id="06460">

    <name><![CDATA[Best Glutamine (400 g, snow cone)]]></name>

    <categoryId>10</categoryId>

    <vendor><![CDATA[BPI sports]]></vendor>

    <country><![CDATA[США]]></country>

    <vendorCode>06460-04</vendorCode>

    <currencyId>USD</currencyId>

    <price>18.72</price>

    <available>true</available>

    <promotion>false</promotion>

    <newProduct>false</newProduct>

    <param name="Фасовка/размер"><![CDATA[400 g]]></param>

    <param name="Вкус/цвет"><![CDATA[snow cone]]></param>

    <warehouses>

    <warehouse id="1">

    <name>Киев</name>

    <available>true</available>

    </warehouse>

    <warehouse id="2">

    <name>Кременчуг</name>

    <available>false</available>

    </warehouse>

    </warehouses>

    </item>

    <item id="000010709_0" group_id="06460" parent="true">

    <name><![CDATA[Best Glutamine (400 g)]]></name>

    <categoryId>10</categoryId>

    <vendor><![CDATA[BPI sports]]></vendor>

    <country><![CDATA[США]]></country>

    <vendorCode>06460</vendorCode>

    <currencyId>USD</currencyId>

    <price>18.72</price>

    <available></available>

    <promotion>false</promotion>

    <newProduct>false</newProduct>

    <param name="Фасовка/размер"><![CDATA[400 g]]></param>

    </item>

    <item id="000010709" group_id="06460">

    <name><![CDATA[Best Glutamine (400 g, snow cone)]]></name>

    <categoryId>10</categoryId>

    <vendor><![CDATA[BPI sports]]></vendor>

    <country><![CDATA[США]]></country>

    <vendorCode>06460-04</vendorCode>

    <currencyId>USD</currencyId>

    <price>18.72</price>

    <available>true</available>

    <promotion>false</promotion>

    <newProduct>false</newProduct>

    <param name="Фасовка/размер"><![CDATA[400 g]]></param>

    <param name="Вкус/цвет"><![CDATA[snow cone]]></param>

    <warehouses>

    <warehouse id="1">

    <name>Киев</name>

    <available>true</available>

    </warehouse>

    <warehouse id="2">

    <name>Кременчуг</name>

    <available>false</available>

    </warehouse>

    </warehouses>

    </item>

    </items>

    </price>
    ';

    $regexp ='/(\t|\s)*?<item[\s>](.|\s|\r|\n)*?<\/item>/';
    $result = '';
    $fordelete = "<available></available>";

    preg_match_all($regexp, $txt, $result);

    foreach($result[0] as $item){

    if(strpos($item, $fordelete) != 0) $txt = str_replace($item, "", $txt);
    }

  • Евгений Фролов
    21 августа в 09:26 |

    Было немного свободного времени, сделал утилу на golang под ваши задачи.

    Вот пример прогонки на тестовом файле который вы описали. Могу скинуть исходный код и/или исполняемый файл (windows/linux)

    Справа "2.xml" входной файл, слева "(2).xml" выходной файл

    image

    Имя и расположение входного и выходного файла можно указать например так: [команда] [входной файл] [выходной файл], если не указать выходной файл, то он сохранит в этот же файл.

    Так же по желанию могу убрать цветной вывод в консоль, так исполняемый файл станет чуть меньше(хотя он и сейчас весит всего 1.7KiB)