Доступ к атрибуту XMLNS с помощью Python Elementree?

Как можно получить доступ к атрибутам NS через ElementTree?

Со следующим:

<data xmlns="http://www.foo.net/a" xmlns:a="http://www.foo.net/a" book="1" category="ABS" date="2009-12-22"> 

Когда я пытаюсь root.get («xmlns»), я возвращаюсь назад. Нет, категория и дата в порядке, любая помощь оценивается ..

  • Выясните, где CDATA находится в элементе lxml?
  • Python ElementTree: анализ строки и получение экземпляра ElementTree
  • Добавление пространства имен xsi: type и envelope при использовании SUDS
  • Стратегия ElementTree iterparse
  • Почему xpath не работает при обработке документа XHTML с помощью lxml (в python)?
  • Разбирайте и подсчитывайте только числовой текст xml, включая e-00 или e + 01
  • Как заменить HTML-комментарии на пользовательские элементы <comment>
  • OpenERP: создать новую запись, one2many many2one отношения
  • 2 Solutions collect form web for “Доступ к атрибуту XMLNS с помощью Python Elementree?”

    Я думаю, что element.tag – это то, что вы ищете. Обратите внимание, что в вашем примере отсутствует конечная косая черта, поэтому она не сбалансирована и не будет анализироваться. Я добавил один в моем примере.

     >>> from xml.etree import ElementTree as ET >>> data = '''<data xmlns="http://www.foo.net/a" ... xmlns:a="http://www.foo.net/a" ... book="1" category="ABS" date="2009-12-22"/>''' >>> element = ET.fromstring(data) >>> element <Element {http://www.foo.net/a}data at 1013b74d0> >>> element.tag '{http://www.foo.net/a}data' >>> element.attrib {'category': 'ABS', 'date': '2009-12-22', 'book': '1'} 

    Если вы просто хотите узнать URI xmlns, вы можете разделить его с помощью функции, например:

     def tag_uri_and_name(elem): if elem.tag[0] == "{": uri, ignore, tag = elem.tag[1:].partition("}") else: uri = None tag = elem.tag return uri, tag 

    Более подробно об именах и квалифицированных именах в ElementTree см. Примеры effbot .

    Посмотрите документацию / примеры документации пространственных имен effbot; в частности, функцию parse_map . В нем показано, как добавить атрибут * ns_map * к каждому элементу, который содержит отображение префикса / URI, относящееся к этому конкретному элементу.

    Однако это добавляет атрибут ns_map ко всем элементам. Для моих нужд я обнаружил, что мне нужна глобальная карта всех пространств имен, используемых для упрощения поиска элемента, а не жесткого кодирования.

    Вот что я придумал:

     import elementtree.ElementTree as ET def parse_and_get_ns(file): events = "start", "start-ns" root = None ns = {} for event, elem in ET.iterparse(file, events): if event == "start-ns": if elem[0] in ns and ns[elem[0]] != elem[1]: # NOTE: It is perfectly valid to have the same prefix refer # to different URI namespaces in different parts of the # document. This exception serves as a reminder that this # solution is not robust. Use at your own peril. raise KeyError("Duplicate prefix with different URI found.") ns[elem[0]] = "{%s}" % elem[1] elif event == "start": if root is None: root = elem return ET.ElementTree(root), ns 

    С помощью этого вы можете проанализировать XML-файл и получить dict с отображением пространства имен. Итак, если у вас есть xml-файл, например следующий («my.xml»):

     <?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"\ > <feed> <item> <title>Foo</title> <dc:creator>Joe McGroin</dc:creator> <description>etc...</description> </item> </feed> </rss> и <?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"\ > <feed> <item> <title>Foo</title> <dc:creator>Joe McGroin</dc:creator> <description>etc...</description> </item> </feed> </rss> 

    Вы сможете использовать xml namespaces и получить информацию для таких элементов, как dc: creator :

     >>> tree, ns = parse_and_get_ns("my.xml") >>> ns {u'content': '{http://purl.org/rss/1.0/modules/content/}', u'dc': '{http://purl.org/dc/elements/1.1/}'} >>> item = tree.find("/feed/item") >>> item.findtext(ns['dc']+"creator") 'Joe McGroin' 
    Python - лучший язык программирования в мире.