Подтвердить что ты не робот

Пространство имен по умолчанию Python ElementTree?

Есть ли способ определить пространство имен по умолчанию /unprefixed в python ElementTree? Это не работает...

ns = {"":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))

И это не делает:

ns = {None:"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))

Это делает, но тогда я должен префикс каждого элемента:

ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))

Использование Python 3.5 в OSX.

EDIT: если ответ "нет", вы все равно можете получить награду:-). Я просто хочу окончательное "нет" от кого-то, кто потратил много времени на его использование.

4b9b3361

Ответ 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"))