análise xml python

análise xml python

Tenho que excluir tags específicas de um arquivo xml. Exemplo de xml abaixo.

       <data>
          <tag:action/>
        </data>

Quero excluir todo o conteúdo entre data e/data. As tags XML não são exibidas na pergunta após a postagem.

Posso fazer isso usando o método remove() no analisador xml Python ElementTree. Estou gravando o conteúdo modificado em um novo após a exclusão do elemento.

tree.write('new.xml');

O problema é que todos os nomes de tags no arquivo xml original são renomeados para ns0e ns1assim por diante em new.xml.

Existe alguma maneira de modificar o arquivo XML mantendo todos os outros conteúdos intactos?

Responder1

Você pode usar uma bela sopa para fazer o trabalho:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import bs4

content = '''
<people>

  <person born="1975">
    <name>
      <first_name>John</first_name>
      <last_name>Doe</last_name>
    </name>
    <profession>computer scientist</profession>
    <homepage href="http://www.example.com/johndoe"/>
  </person>

  <person born="1977">
    <name>
      <first_name>Jane</first_name>
      <last_name>Doe</last_name>
    </name>
    <profession>computer scientist</profession>
    <homepage href="http://www.example.com/janedoe"/>
  </person>

</people>
'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(content)

for s in soup('name'):
    s.extract()

print(soup)

Produz o seguinte resultado:

<html><body><people>
<person born="1975">

<profession>computer scientist</profession>
<homepage href="http://www.example.com/johndoe"></homepage>
</person>
<person born="1977">

<profession>computer scientist</profession>
<homepage href="http://www.example.com/janedoe"></homepage>
</person>
</people>
</body></html>

Com espaços para nome:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import bs4

content = '''<people xmlns:h="http://www.example.com/to/">

  <h:person born="1975">
    <h:name>
      <h:first_name>John</h:first_name>
      <h:last_name>Doe</h:last_name>
    </h:name>
    <h:profession>computer scientist</h:profession>
    <h:homepage href="http://www.example.com/johndoe"/>
  </h:person>

  <h:person born="1977">
    <h:name>
      <h:first_name>Jane</h:first_name>
      <h:last_name>Doe</h:last_name>
    </h:name>
    <h:profession>computer scientist</h:profession>
    <h:homepage href="http://www.example.com/janedoe"/>
  </h:person>

</people>
'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(content).people

for s in soup('h:name'):
    s.extract()

print(soup)

Adicionei .peoplepara prevenir <html><body> </body></html>no resultado.

<people xmlns:h="http://www.example.com/to/">
<h:person born="1975">

<h:profession>computer scientist</h:profession>
<h:homepage href="http://www.example.com/johndoe"></h:homepage>
</h:person>
<h:person born="1977">

<h:profession>computer scientist</h:profession>
<h:homepage href="http://www.example.com/janedoe"></h:homepage>
</h:person>
</people>

informação relacionada