Как я могу получить контент, используя XML :: Twig? - PullRequest
6 голосов
/ 19 сентября 2009

Моя цель состоит в том, чтобы start_tag_handler (см. Ниже) получить содержимое apps / title, когда обнаружит тег apps / title (см. Образец XML ниже).

И end_tag_handler получает содержимое apps / logs, когда находит тег apps / logs.

Но вместо этого этот код возвращает ноль и завершается.

Это код Perl для синтаксического анализа (используется XML :: Twig ) ###:

    #!/usr/local/bin/perl -w

    use XML::Twig;
    my $twig = XML::Twig->new(
                start_tag_handlers =>
                  { 'apps/title' => \&kicks
                  },
                twig_roots =>
                  { 'apps' => \&app
                  },
                end_tag_handlers =>
                  { 'apps/logs' => \&bye
                  }
                );
    $twig -> parsefile( "doc.xml");

    sub kicks {
        my ($twig, $elt) = @_;
        print "---kicks--- \n";
        print $elt -> text;
        print " \n";
    }

    sub app {
        my ($twig, $apps) = @_;
        print "---app--- \n";
        print $apps -> text;
        print " \n";
    }


    sub bye {
        my ($twig, $elt) = @_;
        print "bye \n";
        print $elt->text;
        print " \n";
    }

Это doc.xml ###:

    <?xml version="1.0" encoding="UTF-8"?>
    <auto>
      <apps>
        <title>watch</title>
        <commands>set,start,00:00,alart,end</commands>
        <logs>csv</logs>
      </apps>
      <apps>
        <title>machine</title>
        <commands>down,select,vol_100,check,line,end</commands>
        <logs>dump</logs>
      </apps>
    </auto>

Это вывод в консоли ###:

    C:\>perl parse.pl
    ---kicks---

    ---app---
    watchset,start,00:00,alart,endcsv
    ---kicks---

    ---app---
    machinedown,select,vol_100,check,line,enddump

1 Ответ

9 голосов
/ 19 сентября 2009

Ознакомьтесь с документацией XML::Twig для start_tag_handlers:

Обработчики вызываются с двумя параметрами: ветка и элемент. В этот момент элемент пуст, его атрибуты созданы.

В то время, когда вызывается start_tag_handlers, текстовое содержимое еще даже не просматривается, поскольку разбор начального тега (например, <title>, а не конечного тега </title>) имеет только только что завершено.

Причина, по которой end_tag_handlers не предоставляет текст элемента, возможно, связана с симметрией: -).

Возможно, вы захотите использовать twig_handlers вместо:

my $twig = XML::Twig->new(
    twig_handlers => {
        'apps/title' => \&kicks,
        'apps/logs' => \&bye
    },
    twig_roots => {
        'apps' => \&app
    },
);

Вывод:

---kicks--- 
watch 
bye 
csv 
---app--- 
watchset,start,00:00,alart,endcsv
---kicks--- 
machine 
bye 
dump 
---app--- 
machinedown,select,vol_100,check,line,enddump
...