2015-11-30 5 views
14

Есть ли способ определить пространство имен по умолчанию/unprefixed в python ElementTree? Это не похоже на работу ...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: если ответ «нет», вы все равно можете получить щедрость :-). Я просто хочу окончательное «нет» от кого-то, кто потратил много времени на его использование.

+0

Используя 'ElementTree', вы должны использовать префикс. Если вы используете 'lxml', вы можете использовать' .nsmap' вместо префиксов жесткого кодирования. См. Http://stackoverflow.com/questions/14853243/parsing-xml-with-namespace-in-python-via-elementtree для получения более подробной информации. – gtlambert

ответ

10

Нет прямого пути для прямого обращения к пространствам имен по умолчанию. Присваивающая пустому пространству имен непустого именем является общим решением, так как вы уже упоминали:

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


Вы можете, хотя, сделать вещи проще, по removing the default namespace definition при загрузке входного 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")) 
+0

Для обработки одинарных кавычек: 'r" "" \ s (xmlns = "[^" ] + "| \ sxmlns = '[^'] + ')" "" ' – juloo65

+0

Исправить ответ @ juloo65: ' '' xmlstring = re.sub (r "" "\ s (xmlns =" ​​[^ "] + "| xmlns = '[^'] + ')" "",' ', xmlstring, count = 1) '' ' – Dariosky

Смежные вопросы