@Maloyyy

Как посчитать количество суб-объектов в Python для каждого XML-объекта?

Есть XML-конфиг, который нужно по строкам записать в CSV-таблицу. Каждый объект это правило, которое надо перенести в таблицу. Сложность в том, что количество Суб-Объектов в каждом объекте различаются. И если в одном правиле совпадет Тег, то эти значения надо будет записать в одну ячейку.

Ниже демонстрирую начало и конец xml. файла.
<config>
<list name="TrafficRules_v2" identityCounter="777">
  <listitem>
    <variable name="Id">1</variable>
    <variable name="Order">509</variable>
    <variable name="Enabled">1</variable>
    <variable name="Color">FFCCCC</variable>
    <variable name="Name">VPN Services</variable>
    <variable name="Description">Allows access to VPN</variable>
    <variable name="IpVersion">4</variable>
    <variable name="Dst">Firewall</variable>
    <variable name="Proxy">default</variable>
    <variable name="Service">"IPsec services" "Kerio VPN" </variable>
    <variable name="ValidTime"></variable>
    <variable name="Action">PERMIT,logpkt,logconn</variable>
    <variable name="NAT">4</variable>
    <variable name="SNAT"></variable>
    <variable name="DNAT"></variable>
  </listitem>
  <listitem>
    <variable name="Id">2</variable>
    <variable name="Order">510</variable>
    <variable name="Enabled">1</variable>
    <variable name="Color">FFCCCC</variable>
    <variable name="Name">Web Services</variable>
    <variable name="Description">Allows access to HTTP and HTTPS from the Internet.</variable>
    <variable name="IpVersion">4</variable>
    <variable name="Dst">Firewall</variable>
    <variable name="Proxy">default</variable>
    <variable name="Service">"HTTP" "HTTPS" </variable>
    <variable name="ValidTime"></variable>
    <variable name="Action">PERMIT,chart,logconn</variable>
    <variable name="NAT">4</variable>
    <variable name="SNAT"></variable>
    <variable name="DNAT"></variable>
  </listitem>
  <listitem>
    <variable name="Id">3</variable>
    <variable name="Order">511</variable>
    <variable name="Enabled">1</variable>
    <variable name="Color">C9EEC6</variable>
    <variable name="Name">VPN Internet access (NAT)</variable>
    <variable name="Description">Enables access from local machines and VPN clients to the Internet using address translation.</variable>
    <variable name="IpVersion">4</variable>
    <variable name="Src">user:"6sada6d9-bc8e-0b4e-dsdx-sdsadqwd97"</variable>
    <variable name="Dst">ifgroup:"internet"</variable>
    <variable name="Proxy">default</variable>
    <variable name="Service"></variable>
    <variable name="ValidTime"></variable>
    <variable name="Action">PERMIT,chart,logconn</variable>
    <variable name="NAT">4</variable>
    <variable name="SNAT">auto</variable>
    <variable name="DNAT"></variable>
  </listitem>
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
  <listitem>
    <variable name="Id">3807</variable>
    <variable name="Order">6</variable>
    <variable name="Enabled">1</variable>
    <variable name="Color">FFFFFF</variable>
    <variable name="Name">Avay-IN</variable>
    <variable name="Description"></variable>
    <variable name="IpVersion">0</variable>
    <variable name="Src">prefix:"172.1.1.0/23"</variable>
    <variable name="Src">prefix:"192.1.1.0/23"</variable>
    <variable name="Src">prefix:"192.1.1.0/24"</variable>
    <variable name="Src">prefix:"172.1.1.0/24"</variable>
    <variable name="Dst">10.101.10.10</variable>
    <variable name="Proxy">default</variable>
    <variable name="Service"></variable>
    <variable name="ValidTime"></variable>
    <variable name="Action">PERMIT</variable>
    <variable name="NAT">4</variable>
    <variable name="SNAT"></variable>
    <variable name="DNAT"></variable>
  </listitem>
  <listitem>
    <variable name="Id">3808</variable>
    <variable name="Order">5</variable>
    <variable name="Enabled">1</variable>
    <variable name="Color">FFFFFF</variable>
    <variable name="Name">media-NET-to-PC-IN</variable>
    <variable name="Description"></variable>
    <variable name="IpVersion">0</variable>
    <variable name="Src">prefix:"192.168.1.0/24"</variable>
    <variable name="Dst">192.168.120.25</variable>
    <variable name="Proxy">default</variable>
    <variable name="Service">tcp:3389 </variable>
    <variable name="ValidTime"></variable>
    <variable name="Action">PERMIT</variable>
    <variable name="NAT">4</variable>
    <variable name="SNAT"></variable>
    <variable name="DNAT"></variable>
  </listitem>
</list>


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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
МТС Краснодар
от 40 000 до 52 000 ₽
Сбер Москва
от 250 000 ₽
Teracloud Санкт-Петербург
от 200 000 ₽