Ich muss bestimmte Tags aus einer XML-Datei löschen. XML-Beispiel unten.
<data>
<tag:action/>
</data>
Ich möchte alle Inhalte zwischen data und /data löschen. Die XML-Tags werden nach dem Posten nicht in der Frage angezeigt.
Ich kann dies tun, indem ich die Methode remove() im Python ElementTree XML-Parser verwende. Ich schreibe den geänderten Inhalt nach dem Löschen des Elements in ein neues Element.
tree.write('new.xml');
Das Problem besteht darin , dass alle Tag-Namen in der ursprünglichen XML-Datei in usw. umbenannt werden ns0
.ns1
new.xml
Gibt es eine Möglichkeit, die XML-Datei so zu ändern, dass alle anderen Inhalte erhalten bleiben?
Antwort1
Sie können für diese Aufgabe eine schöne Suppe verwenden:
#!/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)
Es ergibt sich folgendes Ergebnis:
<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>
Mit Namespaces:
#!/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)
Ich habe hinzugefügt .people
, um <html><body>
</body></html>
das Ergebnis zu verhindern.
<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>