Ответ 1
Нет прямого пути для прозрачного обращения к пространствам имен по умолчанию. Присвоение пустому пространству имен непустое имя является общим решением, как вы уже упоминали:
ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))
Обратите внимание, что lxml.etree
не позволяет явно использовать пустое пространство имен. Вы получите:
ValueError
: пустой префикс пространства имен не поддерживается в ElementPath
Однако вы можете упростить процедуру удаление определения пространства имен по умолчанию при загрузке входных данных XML:
import xml.etree.ElementTree as ET
import re
with open("pom.xml") as f:
xmlstring = f.read()
# Remove the default namespace definition (xmlns="http://some/namespace")
xmlstring = re.sub(r'\sxmlns="[^"]+"', '', xmlstring, count=1)
pom = ET.fromstring(xmlstring)
print(pom.findall("version"))