Leia XML hierárquico (semelhante a uma árvore) em um dataframe do pandas, preservando a hierarquia

Eu tenho um documento XML que contém uma estrutura hierárquica em forma de árvore, veja o exemplo abaixo.

O documento contém vários<Message> tags (copiei apenas uma delas por conveniência).

Cada<Message> possui alguns dados associados (id, status, priority) sozinho.

Além disso, cada<Message> pode conter um ou mais<Street> crianças que novamente têm alguns dados relevantes (<name>, <length>)

Além disso, cada<Street> pode ter um ou mais<Link> crianças que novamente têm seus próprios dados relevantes (<id>, <direction>)

Exemplo de documento XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Root xmlns="someNamespace">
<Messages>
<Message id='12345'>
   <status>Active</status>
   <priority>Low</priority>
   <Area>
    <Streets>
     <Street>
      <name>King Street</name>
      <length>Short</length>
       <Link>
        <id>75838745</id>
        <direction>North</direction>
       </Link>
       <Link>
        <id>168745</id>
        <direction>South</direction>
       </Link>
       <Link>
        <id>975416</id>
        <direction>North</direction>
       </Link>
     </Street>
     <Street>
      <name>Queen Street</name>
      <length>Long</length>
       <Link>
        <id>366248</id>
         <direction>West</direction>
       </Link>
       <Link>
        <id>745812</id>
         <direction>East</direction>
       </Link>
     </Street>
    </Streets>
   </Area>
</Message>
</Messages>
</Root>

Analisar o XML com Python e armazenar os dados relevantes em variáveis não é o problema - posso usar, por exemplo, olxml biblioteca e leia o documento inteiro e execute algumasxpath expressões para obter os campos relevantes ou leia-a linha a linha com oiterparse método.

No entanto, eu gostaria de colocar os dados em um dataframe de pandas, preservando a hierarquia nele. O objetivo é consultar mensagens únicas (por exemplo, expressões booleanas comoif status == Active then get the Message with all its streets and its streets' links) e obtenha todos os dados que pertencem à mensagem específica (suas ruas e seus links). Como isso seria melhor feito?

Tentei abordagens diferentes, mas tive problemas com todas elas.

Se eu criar uma linha de quadro de dados para cada linha XML que contém informações e definir um MultiIndex em[MessageID, StreetName, LinkID], Recebo um índice com muitasNaN nele (que geralmente é desencorajado) porqueMessageID não conhece seus filhosstreets elinks ainda. Além disso, eu não saberia como selecionar um subconjunto de dados pela condição booleana, em vez de obter apenas algumas linhas sem seus filhos.

Ao fazer um GroupBy em[MessageID, StreetName, LinkID], Não sei como recuperar um dataframe (provavelmente MultiIndex) do objeto GroupBy do pandas, pois não há nada a agregar aqui (sem média / std / sum / qualquer, os valores devem permanecer os mesmos).

Alguma sugestão de como isso pode ser tratado com eficiência?

questionAnswers(1)

yourAnswerToTheQuestion