LINUX.ORG.RU

lxml, элементарный вопрос

 ,


0

1

масс-спектрометр вместо нормального текстового формата пишет в гадском XML

<?xml version="1.0" encoding="us-ascii"?>
<Data LowMass="110" HighMass="160" SamplesPerAMU="10" Units="Torr" PiraniPressure="0.0001" TotalPressure="2.5635e-005" FilamentStatus="3" Sample="0">
<Sample Value="-1.06641e-009"/>
<Sample Value="-1.01978e-010"/>
<Sample Value="-2.35242e-011"/>
...
</Data>
хочу эти данные запихнуть в numpy массив, но в официальном мануале (http://lxml.de/tutorial.html) ни одного _простого_ примера как оттуда извлечь что ни будь в читаемом виде. хочется сделать нормальным способом, а не sed'ом удалять эти xmlные извращения.

★★★★★

Последнее исправление: thunar (всего исправлений: 3)

from xml.dom.minidom import *

xml_file = parse('lalala.xml')
sample_list = xml_file.getElementsByTagName('Sample') 

result = [float(sample.attributes['Value'].value) for sample in sample_list]
z00ke
()
Последнее исправление: z00ke (всего исправлений: 2)

ни одного _простого_ примера как оттуда извлечь что ни будь в читаемом виде.

man sed. У меня даже по-русски есть. А этот твой lxml для _сложных_ случаев.

emulek
()
Ответ на: комментарий от emulek

Месье любит разбирать контекстно-свободные грамматики с помощью конечных автоматов? Месье, вы грязный луддит.

harm
()
Ответ на: комментарий от harm

Тут же не произвольный хml, вполне не исключено, что любой валидный выхлоп измерителя разбирается через re.

anonymous
()
Ответ на: комментарий от harm

Месье любит разбирать контекстно-свободные грамматики с помощью конечных автоматов? Месье, вы грязный луддит.

луддит тот, кто запихал XML туда, где достаточно CSV, или name=value.

emulek
()
Ответ на: комментарий от anonymous

Но, зачем использовать кривые неподходящие инструменты?

harm
()
Ответ на: комментарий от harm

я в курсе. Луддиты == тупое неграмотное быдло, которое боится стать не нужным. В частности — мешает продвижению свободных систем и технологий. Но т.к. помешать этому невозможно, луддиты устраиваю саботаж. В частности — навязывают идиотские требования. Ну типа: «ок, будем сохранять не в бинарник с неведомым форматом, а в plain-text. Но тогда в XML!». Часто такое продвигается и под соусом vendor look-in. Т.е. раз не получается помешать упрощению и стандартизации, луддиты пытаются всё усложнить.

emulek
()
Ответ на: комментарий от anonymous

детка, XML это рекомендованный W3C стандарт. Какое он отношение имеет к выхлопу масс-спектрометра? Ты хоть знаешь, что такое W3C? Иди, почитай: http://ru.wikipedia.org/wiki/W3C и пацанам дай ссылку.

emulek
()
Ответ на: комментарий от harm

мне насрать на твоего Неда, который подох 200 лет назад. Если вообще существовал. И подох наверное сделав вдоль, как и положено ненужному быдлу.

emulek
()
Ответ на: комментарий от PolarFox

В любом правильном языке чтение и запись xml не сложнее чтения и записи ASCII плейнтекста.

да ладно! Всяко какую-то левую не мелкую либу надо тянуть. А для plain text'а даже glibc не слишком нужен.

emulek
()
Ответ на: комментарий от emulek

мне насрать на твоего Неда

На твоего, товарищь луддит, на твоего Неда.

harm
()
Ответ на: комментарий от emulek

man sed

Может приведешь однострочник наподобие первого поста? А я тут же пример валидного xml на котором он обосрется.

baverman ★★★
()
Ответ на: комментарий от emulek

Ну, не знаю, мне кажется, xml нормален.
Можно схемку на выхлоп приделать, так проще будет разработчикам, по ней можно генерить парсер и всем валдино и хорошо.

anonymous
()
Ответ на: комментарий от baverman

Может приведешь однострочник наподобие первого поста? А я тут же пример валидного xml на котором он обосрется.

детка, выхлоп надо парсить не от тебя, а от масс-спектрометра. И твой парсер тоже сломается, если вместо Sample Value спектрометр выдаст Very Sample Value. Хотя это всё равно «валидный XML».

emulek
()
Ответ на: комментарий от anonymous

xml нормален.

говно. XML нужен и годен для документов со сложной структурой. А структура в ОПе — полное говно. Что ты там собрался валидировать? <?xml version="1.0" encoding="us-ascii"?> Это, да?

emulek
()
Ответ на: комментарий от emulek

выхлоп надо парсить не от тебя, а от масс-спектрометра.

Вот из-за таких как ты unix — сборище прибитых гвоздями костылей.

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

baverman ★★★
()
Ответ на: комментарий от baverman

Вот из-за таких как ты unix — сборище прибитых гвоздями костылей.

нет не из-за таких. А из-за тех, кто забыл простое правило: Не Усложняй.

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

по моему он тривиален.

но если ты настаиваешь...

sed -rn 's/^\s*<Sample Value="([^"]+)"\/>\s*$/\1/p'
emulek
()
Ответ на: комментарий от anonymous

thx. и всё таки, какой же гнидогадоид придумал пихать в приборы xml вместо православного csv!?

thunar ★★★★★
() автор топика
Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от emulek

но если ты настаиваешь...

Это конечно замечательно, но вызов sed надо вставить где-то между выхлопом девайса и питоноскриптом и после этого говоришь

Не Усложняй.

Решение с lxml — самое простое. Можно даже использовать xml.etree.ElementTree из стандартной библиотеки, если не хочется тянуть зависимость. Интерфейс тот же.

Я понимаю, ты мастер sed'a, но одним молотком не всегда все быстро забьешь.

baverman ★★★
()
from xml.etree import ElementTree

data = ElementTree.parse('data.xml')
samples = data.findall('.//Sample/[@Value]')
print [float(s.attrib['Value']) for s in samples]
anonymous
()
Ответ на: комментарий от PolarFox

В любом правильном языке чтение и запись xml не сложнее чтения и записи ASCII плейнтекста.

/me понимает, что в этом есть доля истины, но практика работы с SOAP почему-то не способствует вере в простоту xml. Может, у меня был неправильный язык?

Или под правильным языком понимается java, на фоне которой xml — верх изящества?

x3al ★★★★★
()
Ответ на: комментарий от x3al

Проблема в SOAP, а не в xml. SOAP хоть в xml, хоть в json будет одинаково убог.

PolarFox ★★★★★
()
Ответ на: комментарий от baverman

Это конечно замечательно, но вызов sed надо вставить где-то между выхлопом девайса и питоноскриптом и после этого говоришь

в питоне есть регулярки и есть замена. Если ты не понял, в моей команде просто замена по RE.

emulek
()
Ответ на: комментарий от baverman

Я понимаю, ты мастер sed'a, но одним молотком не всегда все быстро забьешь.

ох... Ну сколько повторять можно?! Я не говорю «всё». В данном конкретном случае никакой xml тут не нужен в принципе. На кой ляд его сюда зафигачили — я могу только догадываться. Может луддиты, может просто мудаки. Хрень на входе приводит к кривым костылям во всей цепочке. Нет тут никакой структуры, никогда не было, и не будет. Потому и XML тут не нужен. Это всё равно, что забивать гвозди отбойным молотком.

emulek
()
Ответ на: комментарий от baverman

Напиши ее на питоне и увидишь ПРОСТОТУ.

попроси написать кого-нить, у кого lvl в питоне как у меня в sed. Код пишет программист, и от ЯП ничего не зависит (если это нормальный ЯП для практического применения, а не brainfuck)

emulek
()
Ответ на: комментарий от emulek

Ну сколько повторять можно?!

Вопрос не почему железяка выдает xml, а почему ты начал размахивать sed'ом. Не съезжай. Признай, что сморозил глупость и закончим на этом.

baverman ★★★
()
Ответ на: комментарий от baverman

Вопрос не почему железяка выдает xml, а почему ты начал размахивать sed'ом. Не съезжай. Признай, что сморозил глупость и закончим на этом.

проблема в том, что ты влез в спор на середине, не удосужившись прочитать мои посты. Я начал с того, что ЭТОТ случай прост, а XML нужен для другого. И вот именно В ЭТОМ случае подойдёт sed. А в общем случае конечно sed не годна для парсинга XML. И я это знаю похоже намного лучше тебя. Т.ч. не нужно мне это доказывать.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.