У меня есть много строк в базе данных, содержащей XML, и я пытаюсь написать скрипт Python для подсчета экземпляров определенного атрибута узла.
Мое дерево выглядит так:
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
Как я могу получить доступ к атрибутам "1"
и "2"
в XML с помощью Python?
Ответы:
Я предлагаю
ElementTree
. Существуют другие совместимые реализации того же API, напримерlxml
, иcElementTree
в самой стандартной библиотеке Python; но в этом контексте они в основном добавляют еще большую скорость - легкость программирования зависит от API, которыйElementTree
определяет.Сначала создайте экземпляр Element
root
из XML, например, с помощью функции XML , или проанализируйте файл с помощью чего-то вроде:Или любой из множества других способов, показанных на
ElementTree
. Затем сделайте что-то вроде:И похожие, обычно довольно простые, шаблоны кода.
источник
lxml
добавляет больше скорости. Он обеспечивает легкий доступ к такой информации, как родительский узел, номер строки в источнике XML и т. Д., Что может быть очень полезно в нескольких сценариях.Warning The xml.etree.ElementTree module is not secure against maliciously constructed data. If you need to parse untrusted or unauthenticated data see XML vulnerabilities.
minidom
самый быстрый и довольно прямой.XML:
Python:
Вывод:
источник
item
прямо с верхнего уровня документа? не будет ли чище, если вы укажете путь (data->items
)? потому что, что если у вас также естьdata->secondSetOfItems
имя узла,item
и вы хотите перечислить только один из двух наборовitem
?Вы можете использовать BeautifulSoup :
источник
BeautifulStoneSoup
УСТАРЕЛО. Просто используйтеBeautifulSoup(source_xml, features="xml")
ElementTree
, к сожалению, он не может выполнить синтаксический анализ, если я не настроил источник в местах, ноBeautifulSoup
работал сразу же без каких-либо изменений!Есть много вариантов там. cElementTree выглядит превосходно, если скорость и использование памяти являются проблемой. Это очень мало накладных расходов по сравнению с простым чтением в файле с помощью
readlines
.Соответствующие показатели можно найти в таблице ниже, скопированной с веб-сайта cElementTree :
Как указывает @jfs ,
cElementTree
поставляется в комплекте с Python:from xml.etree import cElementTree as ElementTree
.from xml.etree import ElementTree
(ускоренная версия C используется автоматически).источник
from xml.etree import cElementTree as ElementTree
. На Python 3:from xml.etree import ElementTree
(ускоренная версия C используется автоматически)ElementTree
для конкретной задачи. Для документов, которые помещаются в память, его намного проще использоватьminidom
, и он отлично работает для небольших XML-документов.Я предлагаю xmltodict для простоты.
Он анализирует ваш XML в OrderedDict;
источник
result["foo"]["bar"]["type"]
это список всех<type>
элементов, поэтому он все еще работает (хотя структура может быть немного неожиданной).lxml.objectify действительно прост.
Взяв образец текста:
Вывод:
источник
count
сохраняет количество каждого элемента в словаре с ключами по умолчанию, поэтому вам не нужно проверять членство. Вы также можете попробовать посмотретьcollections.Counter
.У Python есть интерфейс для парсера XML-экспата.
Это не проверяющий парсер, поэтому плохой XML не будет пойман. Но если вы знаете, что ваш файл верен, то это довольно хорошо, и вы, вероятно, получите точную информацию, которую хотите, и можете отказаться от всего остального на лету.
источник
Я мог бы предложить declxml .
Полное раскрытие: я написал эту библиотеку, потому что искал способ преобразования между структурами данных XML и Python без необходимости писать десятки строк кода обязательного разбора / сериализации с помощью ElementTree.
С помощью declxml вы используете процессоры для декларативного определения структуры вашего XML-документа и того, как сопоставлять структуры данных XML и Python. Процессоры используются как для сериализации и анализа, так и для базового уровня проверки.
Разбор структур данных Python прост:
Который производит вывод:
Вы также можете использовать тот же процессор для сериализации данных в XML
Который производит следующий вывод
Если вы хотите работать с объектами вместо словарей, вы можете определить процессоры для преобразования данных в и из объектов.
Который производит следующий вывод
источник
Просто чтобы добавить еще одну возможность, вы можете использовать Untangle , так как это простая библиотека xml-to-python-object. Вот вам пример:
Установка:
Применение:
Ваш XML-файл (немного изменен):
Доступ к атрибутам с помощью
untangle
:Выход будет:
Более подробную информацию о Untangle можно найти в разделе « Untangle ».
Также, если вам интересно, вы можете найти список инструментов для работы с XML и Python в разделе « Python and XML ». Вы также увидите, что наиболее распространенные были упомянуты в предыдущих ответах.
источник
Здесь очень простой, но эффективный код с использованием
cElementTree
.Это из " разбора python xml ".
источник
XML:
Код Python:
Вывод:
источник
Это напечатает значение
foobar
атрибута.источник
xml.etree.ElementTree против lxml
Вот некоторые плюсы двух наиболее часто используемых библиотек, которые мне было бы полезно узнать, прежде чем выбирать между ними.
xml.etree.ElementTree:
LXML
standalone="no"
?.node
.sourceline
позволяет легко получить строку используемого вами элемента XML.источник
Я нахожу Python xml.dom и xml.dom.minidom довольно простым. Имейте в виду, что DOM не подходит для больших объемов XML, но если ваш ввод довольно мал, это будет работать нормально.
источник
Нет необходимости использовать специфичный для lib API, если вы используете
python-benedict
. Просто инициализируйте новый экземпляр из вашего XML и управляйте им легко, так как этоdict
подкласс.Установка проста:
pip install python-benedict
Он поддерживает и нормализует операции ввода / вывода со многими форматами:
Base64
,CSV
,JSON
,TOML
,XML
,YAML
иquery-string
.Это хорошо проверено и с открытым исходным кодом на GitHub .
источник
источник
Если источником является файл XML, скажем, как этот пример
Вы можете попробовать следующий код
Выход будет
источник