LINUX.ORG.RU

Нужна помощь, разобрать xml

 , , ,


0

1

Привет. Есть такой файл xml: https://cloud.mail.ru/public/fe2a1137669d/ISC BIND 9 Statistics.xml Статистика сервера bind Нужно выдрать некоторые данные для графика cacti Превратить в такой вид: a:24562362 aaaa:2354235623 mx:2346346 и тд. Там имеются по 2 значения, входящие и исходящие, значения надо сложить и выдать уже как указано выше. Ковыряюсь с sed, но пока с трудом дается. Пока такое получилось: cat stats.xml | sed '/name=\«AAAA\»>/s/.*name=\«AAAA\»>\([0-9]*\)<.*/\1/;' >stats_out.xml Но выдает только одно последнее значение и еще пара лишних строк сверху. С регулярными не дружу, точнее только начинаю дружить :)

регулярные выражения для разбора xml использовать нельзя. Регулярные выражения только для регулярных языков.

anarquista ★★★★★
()

Сейчас тебе накидают ссылок на удавленых котят, потом придет zolden и скажет что задача конкретная и соорудит монстро-sed, а я просто д'Артаньян.

import xml.etree.cElementTree as etree

root = etree.parse('/tmp/boo.xml')
for node in root.findall('.//counter[@name]'):
    print '{}:{}'.format(node.attrib['name'], node.text)

Кстати, дятлы с lxml тоже идут лесом.

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

У меня задача не научить дворника, а держать форму. К тому же таким образом я буду только ценнее как специалист.

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

я не разбираю xml, клянусь тебе, я же знаю что разбором может называться только 100мегабайтные набор хаотично раположенных незакрытых тегов

% echo '<span class="special">текст1</span><span class="special">текст2</span>' | grep -Po '<span class="special">\K.*?(?=</span>)'
текст1
текст2
zolden ★★★★★
()

держи

  • раз
    Установить perl XML::LibXML
    В Debian/Ubuntu apt-get install libxml-libxml-perl
    либо cpan -i  XML::LibXML
    
  • два
    perl -M5.010 -Mstrict -MXML::LibXML -wE '
    my %h; my $dom = XML::LibXML->load_xml(location => $ARGV[0]);
    foreach($dom->findnodes(q[//counters/counter])){
    $h{$_->getAttribute(q[name])} += $_->to_literal};
    say join q[ ], map { $_.q[:].$h{$_} } sort keys %h' stats.xml
    
  • три
    A:1214123775 AAAA:179699337 ANY:1760703 AXFRReqv4:0 AXFRReqv6:0 AuthQryRej:135 CNAME:101452 DNSKEY:5 DS:986 EDNS0Fail:0 FDWatchClose:0 FDwatchConn:0 FDwatchConnFail:0 FDwatchRecvErr:0 FDwatchSendErr:0 FORMERR:6 FdwatchBindFail:0 GlueFetchv4:8588861 GlueFetchv4Fail:161129 GlueFetchv6:0 GlueFetchv6Fail:0 IQUERY:4 IXFRReqv4:0 IXFRReqv6:0 Lame:88676 MX:460313 Mismatch:41221 NAPTR:28057 NOTIFY:8 NS:1381819 NXDOMAIN:14986588 NotifyInv4:0 NotifyInv6:0 NotifyOutv4:0 NotifyOutv6:0 и т.д.
    
pru-mike ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.