[python, xml] По-быстрому взять кое-что из xml-файла

july

Кто бы мне помог — я никогда этого не делал: мне нужно в пайтоне из довольно большого xml файла взять только одну вещь.
В файле есть тег (среди прочих):

<ScannerSettingRecord Identifier="nDelayTime_ms"
Unit="ms" Description="Delay[ms]" Data="0" Variant="345"
VariantType="3"/>

Мне нужно только значение Variant.
Есть ли способ это сделать по-быстрому, не ботая всякое там хитрое про sax или dom и прочее про xml (я в этом совершенно не разбираюсь)?

Dmitriy82


 
не ботая всякое там хитрое про sax или dom
re, если контекст не сильно важен.

VitMix

Кошерный способ --- это XPath. Вот тут: http://www.somebits.com/weblog/tech/python/xpath.html пример довольно вдохновляющий:
import libxml2
doc = libxml2.parseFile('foo.opml')
for url in doc.xpathEval('//@xmlUrl'):
print url.content

Осталось только написать XPath запрос для твоего случая и подставить вместо '//@xmlUrl'. В твоём случае будет что-то типа:
import libxml2
doc = libxml2.parseFile('foo.xml')
v = doc.xpathEval('//ScannerSetVariant')

pitrik2

re, если контекст не сильно важен.
если в xml нет комментириев или секций CDATA с ентим тегом то этот способ наверна идеален

pitrik2

Кошерный способ --- это XPath
этот кошерный способ не подходит топикстартеру
у него "довольно большой xml"
а ты тут полное DOM дерево строишь
это может занять долгое время и может не хватить памяти
SAX тут гораздо лучше
c XPATH получается парсинг полностью всего документа, загрузка дерева тегов в память, потом относительно быстрое нахождение нужного элемента
SAX - это фактически пробежка подряд по всем тегам до нужного

july

Спасибо, похоже, что этот способ мне и нужен. Как выяснилось, файл не очень большой, так что проблем с чтением его в память не должно возникнуть.

VitMix

у него "довольно большой xml"
а ты тут полное DOM дерево строишь
Построение полного DOM дерева отлично подходит для "довольно больших XML". Оно даже для "очень больших XML" подходит. Сам проверял. Согласен, что с "огромными" и "гигантскими" XML могут быть проблемы.
Однако в данном случае кошерным является использование XPath а не полная загрузка XML в память. Просто в примере, который нагуглился первым, XPath применялся к XML, полностью загруженному в память.

pitrik2

Просто в примере, который нагуглился первым, XPath применялся к XML, полностью загруженному в память.
видел штуки типа облегченного DOM парсинга для XPath, типа DOM дерево создается из легковесных ридонли объектов
а можешь кинуть примеры где XPath без полного предварительного DOM парсинга?
Оставить комментарий
Имя или ник:
Комментарий: