open - Cómo eliminar el atributo del elemento raíz en Python xml etree ElementTree
xml etree elementtree tutorial (2)
En la biblioteca estándar xml.etree.ElementTree no hay un método especial para eliminar un atributo, pero todos los atributos se almacenan en un attrib
que es un dict
y cualquier atributo se puede eliminar de attrib
como una clave de un dict
:
import xml.etree.ElementTree as ET
tree = ET.parse(file_path)
root = tree.getroot()
print(root.attrib) # {''xyz'': ''123''}
root.attrib.pop("xyz", None) # None is to not raise an exception if xyz does not exist
print(root.attrib) # {}
ET.tostring(root)
''<urlset> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>''
Mi archivo contiene los siguientes datos:
Original:
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>
Esperado:
<?xml version="1.0" encoding="UTF-8"?><urlset> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>
Yo uso etree para analizar el archivo y quiero eliminar el atributo del elemento raíz ''urlset''
import xml.etree.ElementTree as ET
tree = ET.parse("/Users/hsyang/Downloads/VI-0-11-14-2016_20.xml")
root = tree.getroot()
print root.attrib
>> {}
root.attrib.pop("xmlns", None)
print root.attrib
>> {}
ET.tostring(root)
Pensé que debía obtener {xmlns: " http://www.sitemaps.org/schemas/sitemap/0.9 "} cuando imprimí root.attrib la primera vez pero obtuve un diccionario vacío. ¿Alguien puede ayudar?
¡Lo aprecio!
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
parece un atributo regular, pero es un caso especial, a saber, una declaración de espacio de nombres.
Eliminar, agregar o modificar espacios de nombres puede ser bastante difícil. Los atributos "Normal" se almacenan en la propiedad attrib
escribible de un elemento. Las asignaciones de espacio de nombres, por otro lado, no están disponibles fácilmente a través de la API (en la biblioteca lxml, los elementos tienen una propiedad nsmap
, pero es de solo lectura).
Sugiero una operación de búsqueda y reemplazo textual simple, similar a la respuesta a Modificar espacios de nombres en un documento XML dado con lxml . Algo como esto:
with open("input.xml", "r") as infile, open("output.xml", "w") as outfile:
data = infile.read()
data = data.replace('' xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"'', '''')
outfile.write(data)
Consulte también ¿Cómo insertar espacios de nombre y prefijos en una cadena XML con Python? .