2011-11-20 4 views
7

Я работаю с некоторыми данными XML, которые в некоторых местах в каждом файле переопределяют пространство имен. Я пытаюсь вытащить все теги определенного типа из документа независимо от пространства имен, которое активно в точке, где тег находится в XML.Parse XML с Python Etree и Return Specified Tag Независимо от пространства имен

Я использую findall('.//{namespace}Tag'), чтобы найти элементы, которые я ищу. Но никогда не зная, что будет {namespace} в любой точке файла, заставляет его ударить или пропустить, получим ли я все запрошенные теги или нет.

Есть ли способ вернуть все элементы тега независимо от {namespace}, подпадающих под них? Что-то вроде линии findall('.//{wildcard}Tag')?

+0

Учитывая этот вопрос не получил ответа в некоторое время, здесь некоторые предложения. Если вы уже решили свою проблему, отлично! Но обязательно отправьте его здесь, чтобы мы не получили [Fermat thread] (http://b.wardje.eu/2012/01/fermat-tread.html) на наших руках. Если нет, то код и XML-пример проблемы будут удобны. –

ответ

3

Функция xpath lxml поддерживает local-name()!

Вот Python 3 Пример:

import io 
from lxml import etree 
xmlstring = '''<root 
xmlns:m="http://www.w3.org/html4/" 
xmlns:n="http://www.w3.org/html5/"> 
<m:table> 
    <m:tr> 
    <m:name>Sometext</m:name> 
    </m:tr> 
</m:table> 
<n:table> 
    <n:name>Othertext</n:name> 
</n:table> 
</root>''' 
root = etree.parse(io.StringIO(xmlstring)) 
names = root.xpath("//*[local-name() = 'name']") 
for name in names: 
    print(name.text) 

Ваш вопрос может быть aswered до этого на: lxml etree xmlparser namespace problem

+0

какой это выход. ты его запустил? Не уверен, что это действительно работает. –

+0

я получаю эту ошибку: Traceback (самый последний вызов последнего): xml_test.py Файл», строка 15, в корень = etree.parse (io.StringIO (xmlstring)) TypeError: initial_value должен быть юникода или None, не str –

+0

Фактический результат: «Sometext \ nOthertext \ n» – phobie

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

  • Нет связанных вопросов^_^