Я разбираю XML-документ, который мы будем получать от поставщика каждый день, и он сильно использует пространства имен. Я минимизировал проблему до крошечного подмножества здесь:Как получить атрибут элемента с пространством имен
Есть некоторые элементы, которые мне нужны для синтаксического анализа, и все они являются дочерними элементами другого элемента, который имеет в нем определенный атрибут.
Я могу использовать lxml.etree.Element.findall(TAG, root.nsmap)
, чтобы найти узлы-кандидаты, чей атрибут мне нужно проверить.
Затем я пытаюсь проверить атрибут каждого из этих Элементов с помощью имени, которое, как я знаю, он использует: здесь конкретно ss:Name
. Если значение этого атрибута является тем, что я хочу, я собираюсь погрузиться глубже в упомянутый Элемент, чтобы продолжать делать другие вещи.
Как я могу это сделать?
XML-я разборе примерно
<FOO xmlns="SOME_REALLY_LONG_STRING"
some gorp declaring a bunch of namespaces one of which is
xmlns:ss="THE_VERY_SAME_REALLY_LONG_STRING_AS_ROOT"
>
<child_of_foo>
....
</child_of_foo>
...
<SomethingIWant ss:Name="bar" OTHER_ATTRIB_I_DONT_WANT>
....
<MoreThingsToLookAtLater>
....
</MoreThingsToLookAtLater>
....
</SomethingIWant>
...
</FOO>
Я нашел первый элемент я хотел SomethingIWant
как так (в конечном счете, я хочу их все, поэтому я найти все)
import lxml
from lxml import etree
tree = etree.parse(myfilename)
root = tree.getroot()
# i want just the first one for now
my_sheet = root.findall('ss:RecordSet', root.nsmap)[0]
Теперь я хочу получить атрибут ss:Name
этого элемента, чтобы проверить его, но я не уверен, как это сделать.
Я знаю, что my_sheet.attrib
отобразит мне необработанный URI, за которым следует имя атрибута, но я этого не хочу. Мне нужно проверить, имеет ли он определенное значение для атрибута specificc namespaced. (Потому что, если это неправильно, я могу полностью пропустить этот элемент из дальнейшей обработки).
Я пробовал использовать lxml.etree.ElementTree.attrib.get()
, но, похоже, я ничего не получаю.
Любые идеи?
ли вы на самом деле с помощью 'lxml' библиотеки или только XML-парсер от стандартной питон? Что такое 'etree' точно,' lxml.etree'? – har07
обновлено снова на основе @ har07 answer – UpAndAdam
Итак, вы хотите получить атрибут в пространстве имен из ранее выбранного элемента, например 'my_sheet' в фрагменте кода. В этом случае мое обновление имеет отношение к вашему обновленному вопросу. – har07