Мне нужно удалить определенные теги из xml-файла. Пример xml ниже.
<data>
<tag:action/>
</data>
Я хочу удалить все содержимое между data и /data. Теги XML не отображаются в вопросе после публикации.
Я могу сделать это с помощью метода remove() в XML-парсере Python ElementTree. Я записываю измененное содержимое в новый после удаления элемента.
tree.write('new.xml');
Проблема в том, что все имена тегов в исходном XML-файле переименованы в ns0
, ns1
и так далее в new.xml
.
Есть ли способ изменить XML-файл, сохранив все остальное содержимое без изменений?
решение1
Для этой цели можно использовать прекрасный суп:
#!/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)
Это дает следующий результат:
<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>
С пространствами имен:
#!/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)
Я добавил .people
, чтобы предотвратить <html><body>
</body></html>
результат.
<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>