LINUX.ORG.RU

поиск данных в файле .xml


0

1

добрый вечер, господа. необходимо сгрепать или как-то ещё найти ряд параметров. именно- что идёт за символами <keybind key= потом за <execute>; и так от начала документа до конца, то есть, если в доке есть


<keybind key="W-k">
      <action name="Execute">
        <execute>avidemux</execute>
      </action>
    </keybind>
    <keybind key="W-space">
      <action name="Execute">
        <execute>gnome-terminal</execute>
      </action>
    </keybind>
    <keybind key="XF86Search">
      <action name="Execute">
        <execute>epiphany</execute>
      </action>
    </keybind>

то вывод должен быть таким

W-k   -  avidemux
W-space  - gnome-terminal
XF86Search - epiphany

реально ли?


Учитывая то, что в xml-файлах не всегда такое хорошее форматирование, как в примере, я бы посоветовал xsltproc.

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

отлично, а можно поподробнее как это осуществить?

ratte
() автор топика
Ответ на: комментарий от zhuravlik

в моём- хорошее. спасибо за совет.

ratte
() автор топика

Я бы посоветовал xml2. На выходе получишь набор строк, ориентированный на использование grep и т.п.

GotF ★★★★★
()

Да, реально. Кури xslt, xpath, xquery.

post-factum ★★★★★
()

если перла не боитесь, то примерно так:

#!/usr/bin/perl

use strict;
use XML::Twig;

XML::Twig->new(twig_handlers=>{'keybind/action/execute'=>sub{
        print $_[1]->parent->parent->{att}{key}, ' - ', $_[1]->text, "\n";
}})->parsefile('test.xml');

зависит от пакета XML::Twig (из CPAN).

можно и однострочником:

perl -MXML::Twig -e '$/=undef;XML::Twig->new(twig_handlers=>{"keybind/action/execute"=>sub{print $_[1]->parent->parent->{att}{key}," - ",$_[1]->text, "\n"}})->parse(<>)' <text.xml

arsi ★★★★★
()

На питоне можно набыдлокодить так:

import sys

x = ''
for i in open(sys.argv[1]).read().split('<'):
  if x and i.startswith('execute>'):#command
    print(x + i[8:]); x=None
  elif i.startswith('keybind key='):
    x = i[13:].replace('">',' =')
Как оно работает:
$ python 1.py .config/openbox/rc.xml
A-F2 =
      dmenu_run
W-Up =
      amixer set Master 2%+
W-Down =
      amixer set Master 2%-
W-Left =
      mpc prev
W-Right =
      mpc next
W-Shift_R =
      mpc toggle

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

Что перл, что питон — не читабельно

package require tdom

set fd   [open input.xml r]
  set data [read $fd]
close $fd

set doc  [dom parse $data]
set root [$doc documentElement]

foreach el [$root selectNodes //keybind] {
  puts "key = [$el getAttribute key]"
  puts "execute = [[$el selectNodes .//execute] text]"
}
sdio ★★★★★
()
$ sed -rn 's/.*<keybind key="([^"]*)">.*/\1/;Tl;h;b;:l;s~.*<execute>(.*)</execute>.*~\1~;T;G;s/(.*)\n(.*)/\2 - \1/p' xx.xml
W-k - avidemux
W-space - gnome-terminal
XF86Search - epiphany
drBatty ★★
()
$cat in.xml 
<?xml version="1.0" encoding="UTF-8"?>
<keys>
<keybind key="W-k">
  <action name="Execute">
    <execute>avidemux</execute>
  </action>
</keybind>
---------------------8-<------------------
</keys>

$cat style.xslt 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="keybind">

            <xsl:value-of select="@key"/>
            <xsl:text>    —    </xsl:text>
            <xsl:value-of select="action/execute"/>
            <xsl:text>&#xA;</xsl:text>

    </xsl:template>
</xsl:stylesheet>

$xsltproc style.xlst in.xml | grep -v '^$'
W-k    —    avidemux
W-space    —    gnome-terminal
XF86Search    —    epiphany

Хоть и небольшая проблема с переносами, но ищет по всему документу и выводит что надо...

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