【问题标题】:How can I get content using XML::Twig?如何使用 XML::Twig 获取内容?
【发布时间】:2010-11-29 16:15:31
【问题描述】:

我的目标是start_tag_handler(见下文)在找到apps/title 标签时获取apps/title 内容(见下文示例XML)。

并且 end_tag_handler 在找到 apps/logs 标记时获取 apps/logs 内容。

但此代码返回 null 并退出。

这是用于解析的 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

【问题讨论】:

    标签: xml perl xml-twig


    【解决方案1】:

    查看XML::Twigstart_tag_handlers 文档:

    使用 2 个参数调用处理程序:树枝和元素。此时元素为空,但它的属性已创建。

    在调用start_tag_handlers 时,甚至还没有看到文本内容,因为解析开始标记(例如&lt;title&gt;,而不是结束标记&lt;/title&gt;)已经刚刚完成。

    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
    

    【讨论】:

    • 非常感谢您,我会尝试您的想法,然后再发表评论。而且我误解了 XML::Twig 文档,我以为 start_tag_handlers 那时就知道了……
    • twig_handlers 是调用处理程序的常用方式,只有在无法使用 twig_handlers 时才应使用 start_tag_handlers(例如,元素可能太大)。 end_tag_handlers 应该使用更少,如文档中所述。
    • 成功了!哇,作者。我会仔细阅读。-> 致米罗德。非常感谢,作者的评论让我有点惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多