【问题标题】:attribute comparision using XML::Twig使用 XML::Twig 进行属性比较
【发布时间】:2014-07-10 13:31:30
【问题描述】:

我有像这样的巨大 xml 文件:

  <List NAME="ANDREW" ENROLED="2" FEE="640" CONFORMATION="I"> 
     <DATA>
       <HOUSE>
        <PRIMARY GROUP_ID="37496" SECTION="A"/>
        <PRIMARY GROUP_ID="37496" SECTION="B"/>
       </HOUSE>
      </DATA>
     </List>
     <List NAME="SAM" ENROLED="4" FEE="640"  CONFORMATION="O">
      <DATA>
       <HOUSE>
        <PRIMARY GROUP_ID="36816" SECTION="A"/>
        <PRIMARY GROUP_ID="36816" SECTION="B"/>
       </HOUSE>
      </DATA>
     </List>
     <List NAME="RAY" ENROLED="1" FEE="982"   CONFORMATION="O">
      <ADDRESS>
       <STREET>
        <PRIMARY GROUP_ID="36892" SECTION="A"/>
        <PRIMARY GROUP_ID="36892" SECTION="B"/>
       </STREET>
      </ADDRESS>
     </List>
      <List NAME="MATHEW" ENROLED="3" FEE="467" CONFORMATION="I">
     <DATA>
       <HOUSE>
        <PRIMARY GROUP_ID="37436" SECTION="A"/>
        <PRIMARY GROUP_ID="37436" SECTION="B"/>
       </HOUSE>
      </DATA>
     </List>
     <List NAME="RAY" ENROLED="1" FEE="982"   CONFORMATION="O">
      <ADDRESS>
       <STREET>
        <PRIMARY GROUP_ID="36892" SECTION="A"/>
        <PRIMARY GROUP_ID="36892" SECTION="B"/>
       </STREET>
      </ADDRESS>
     </List>

如果 CONFORMATION 是“O”,我必须打印“FEE”和“GROUP_ID”的值,如果 conformation 是“I”,我必须在单独的行中打印。

我使用了以下程序我得到了帮助

XML::Twig;

my $phraser = XML::Twig->new(twig_handlers => {API_PORT => \&process_list});
$phraser -> parsefile("FS_CONF.xml");

sub process_list 
{
    my ( $twig, $list ) = @_;
    my $conformation = $list -> att( 'LIST' ); 

 my $fee = $list -> att ( 'FEE' );
    foreach my $primary ( $list -> first_child ( 'DATA' ) -> first_child ('HOUSE') -> children() )
    {
        my $group_id = $primary -> att ( 'GROUP_ID' );
        print "$conformation, $fee, $group_id\n";

    }

}

打印两个值后 它显示错误,因为所有标签都不相同并显示错误 无法在未定义的值上调用方法第一个子项。

这是因为所有的“first_child”都不相似。

请帮忙。

【问题讨论】:

    标签: perl xml-twig


    【解决方案1】:

    将您的处理程序更改为List

    CONFORMATION 用于$conformation

    使用defined 检查DATA 标签。

    use warnings;
    use strict;
    use XML::Twig;
    
    my $phraser = XML::Twig->new( twig_handlers => { List => \&process_list } );
    $phraser->parsefile("FS_CONF.xml");
    
    sub process_list {
        my ( $twig, $list ) = @_;
        my $conformation = $list->att('CONFORMATION');
        my $fee = $list->att('FEE');
        if (defined $list->first_child('DATA')) {
            foreach my $primary ( $list->first_child('DATA')->first_child('HOUSE')->children() ) {
                my $group_id = $primary->att('GROUP_ID');
                print "$conformation, $fee, $group_id\n";
            }
        }
    }
    

    【讨论】:

    • 谢谢我得到了正确的输出。如果我想再提取一个“DATA”“size”的数据。那么我该如何管理这两个分支。示例 (List NAME="MATHEW" ENROLED="3" FEE="467" CONFORMATION="I") (DATA size ="128") (HOUSE) (PRIMARY GROUP_ID="37436" SECTION="A"/) 谢谢你回复
    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2012-02-18
    相关资源
    最近更新 更多