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

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

Войти через центр авторизации
Похожие вопросы