Получение атрибутов тега lxml с пространствами имен

Мой XML выглядит так:

... <termEntry id="c1"> <langSet xml:lang="de"> ... 

И у меня есть код:

 from lxml import etree ... for term_entry in root.iterfind('.//termEntry'): print term_entry.attrib['id'] print term_entry.nsmap for lang_set in term_entry.iterfind('langSet'): print lang_set.nsmap print lang_set.attrib for some_stuff in lang_set.iterfind('some_stuff'): ... 

Я получаю пустой nsmap dict, и мой атрибут dict выглядит как {'{http://www.w3.org/XML/1998/namespace}lang': 'en'}

Файл может не содержать xml: в пространстве имен или может иметь другое пространство имен. Как я могу узнать, какое пространство имен используется в объявлении тега? На самом деле, мне просто нужно получить атрибут lang , мне все равно, какое пространство имен было использовано. Я не хочу использовать какой-либо дрянной мусор, например lang_set.attrib.values()[0] или другие поиски поля с известным именем.

мне просто нужно получить атрибут lang , мне все равно, какое пространство имен было использовано

Ваш вопрос не очень ясен, и вы не представили ни одного полного кода исполняемого кода. Но делать некоторые манипуляции с строкой, как это было предложено в комментарии @mmgp, может быть достаточно.

Однако xml:lang – это не то же самое, что random_prefix:lang (или просто lang ). Я думаю, вы должны заботиться о пространстве имен. Если целью является определение естественного языка, который применяется к содержимому элемента, то вы должны использовать xml:lang (поскольку это явная цель этого атрибута, см. http://www.w3.org/TR/REC- xml / # sec-lang-tag ).


Я просто хочу знать, где хранится строка {http://www.w3.org/XML/1998/namespace} для атрибутов .

Важно знать, что префикс xml является особым. Он зарезервирован (в отличие от почти всех других префиксов пространства имен, которые должны быть произвольными) и определяется как связанный с http://www.w3.org/XML/1998/namespace .

Из рекомендаций Namespaces в XML 1.0 W3C :

Префикс xml по определению связан с именем пространства имен http://www.w3.org/XML/1998/namespace . Он МОЖЕТ, но не должен, быть объявленным и НЕ ДОЛЖЕН быть привязан к другому имени пространства имен. Другие префиксы НЕ ДОЛЖНЫ быть привязаны к этому имени пространства имен и НЕ ДОЛЖНЫ быть объявлены как пространство имен по умолчанию.

Другим использованием префикса xml являются атрибуты xml:space и xml:base .


Это действительно странно, если lxml не предоставляет никакого способа обработки пространства имен

lxml обрабатывает пространства имен просто отлично, но префиксы избегают как можно больше. Вам понадобится использовать имя пространства имен http://www.w3.org/XML/1998/namespace при выполнении поиска, которые включают префикс xml .

вы можете просто использовать xpath:

 lang_set.xpath('./@xml:lang')[0] 

кстати, вы работаете с TBX-файлами?