Разобрать сложный файл xml с помощью Python - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь разобрать файл матрицы c сетевого трафика в формате XML. Он включает объемы трафика c между исходным (исходным) и конечным узлами. У меня есть матрица c трафика последовательности, что означает, что трафик c развивается с течением времени и представлен временной последовательностью от 0 до временной последовательности N. В качестве примера я прилагаю файл ниже, который включает XML матрица traffic c, в которой есть две временные последовательности (т.е. seq 0 и 1), и в каждой временной последовательности есть два источника (т.е. 20 и 21) и набор пунктов назначения (т.е. 32, 33, 34, 35, 28, 29, 30, 31). Числа с плавающей запятой - это объем c трафика в Мбит / с.

Я ищу, чтобы проанализировать такую ​​матрицу и найти объем c трафика каждого [origin - destination] с течением времени.

Например: мне интересно получить следующую информацию только из файла,

            Time seq"0"
                       Origin --  Destination --  Traffic volume

                        20    --      32     --   0.278971163226 
                        .
                        . 
                        .
                        20   - -      31     --   0
                        21    --      32     --   0.0720389596699 
                        .
                        . 
                        .
                        21   - -      31     --   0.646495362713
            Time seq"1"
                       
                        20    --      32     --   0.348919367445 
                        .
                        . 
                        .
                        20   - -      31     --   0.348919367445
                        21    --      32     --   0.264369876118 
                        .
                        . 
                        .
                        21   - -      31     --   0

Вот файл XML.

-<traffic-matrix type="sequence">
 -<time seq="0">
   <property name="volume_unit" type="string">Mbps</property>
  -<origin id="20" id.type="int">
     <destination id="32" id.type="int">0.278971163226</destination>
     <destination id="33" id.type="int">0.21534822478</destination>
     <destination id="34" id.type="int">0.417878716061</destination>
     <destination id="35" id.type="int">0.126812437403</destination>
     <destination id="28" id.type="int">0.0</destination>
     <destination id="29" id.type="int">0.377649042951</destination>
     <destination id="30" id.type="int">0.230012161609</destination>
     <destination id="31" id.type="int">0.0</destination>
   </origin>
  -<origin id="21" id.type="int">
    <destination id="32" id.type="int">0.0720389596699</destination>
    <destination id="33" id.type="int">0.0194404241696</destination>
    <destination id="34" id.type="int">0.416078923017</destination>
    <destination id="35" id.type="int">0.271277529292</destination>
    <destination id="28" id.type="int">0.0219082425921</destination>
    <destination id="29" id.type="int">0.0</destination>
    <destination id="30" id.type="int">0.0645726634169</destination>
    <destination id="31" id.type="int">0.646495362713</destination>
   </origin>
 </time>
-<time seq="1">
   <property name="volume_unit" type="string">Mbps</property>
  -<origin id="20" id.type="int">
    <destination id="32"id.type="int">0.348919367445</destination>
    <destination id="33" id.type="int">0.0</destination>
    <destination id="34" id.type="int">0.0</destination>
    <destination id="35" id.type="int">0.0</destination>
    <destination id="28" id.type="int">0.0</destination>
    <destination id="29" id.type="int">0.11926219607</destination>
    <destination id="30" id.type="int">0.0</destination> 
    <destination id="31" id.type="int">0.128091658298</destination>
   </origin>
  -<origin id="21" id.type="int">
    <destination id="32" id.type="int">0.264369876118</destination>
    <destination id="33" id.type="int">0.0</destination>
    <destination id="34" id.type="int">0.136801239629</destination>
    <destination id="35" id.type="int">0.172101959022</destination> 
    <destination id="28" id.type="int">0.289540759798</destination>
    <destination id="29" id.type="int">0.0</destination>
    <destination id="30" id.type="int">0.519869498363</destination>
    <destination id="31" id.type="int">0.0</destination>
   </origin>
 </time>
</traffic-matrix>

1 Ответ

0 голосов
/ 05 августа 2020

Вот решение с библиотекой beautifulsoup - здесь используется для анализа XML. Этот скрипт создаст pandas DataFrame из данных (xml_data - это ваш XML из вопроса):

import pandas as pd
from bs4 import BeautifulSoup


soup = BeautifulSoup(xml_data, 'html.parser')

all_data = []
for d in soup.select('destination'):
    all_data.append({
        'Time_seq': int(d.find_previous('time')['seq']),
        'Origin': int(d.find_previous('origin')['id']),
        'Destination': int(d['id']),
        'Traffic volume': d.text
    })

df = pd.DataFrame(all_data)
print(df)

Печать:

    Time_seq  Origin  Destination   Traffic volume
0          0      20           32   0.278971163226
1          0      20           33    0.21534822478
2          0      20           34   0.417878716061
3          0      20           35   0.126812437403
4          0      20           28              0.0
5          0      20           29   0.377649042951
6          0      20           30   0.230012161609
7          0      20           31              0.0
8          0      21           32  0.0720389596699
9          0      21           33  0.0194404241696
10         0      21           34   0.416078923017
11         0      21           35   0.271277529292
12         0      21           28  0.0219082425921
13         0      21           29              0.0
14         0      21           30  0.0645726634169
15         0      21           31   0.646495362713
16         1      20           32   0.348919367445
17         1      20           33              0.0
18         1      20           34              0.0
19         1      20           35              0.0
20         1      20           28              0.0
21         1      20           29    0.11926219607
22         1      20           30              0.0
23         1      20           31   0.128091658298
24         1      21           32   0.264369876118
25         1      21           33              0.0
26         1      21           34   0.136801239629
27         1      21           35   0.172101959022
28         1      21           28   0.289540759798
29         1      21           29              0.0
30         1      21           30   0.519869498363
31         1      21           31              0.0
...