免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3008 | 回复: 2
打印 上一主题 下一主题

请教各位perl在循环XML文档时问题出在哪儿了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-19 10:29 |只看该作者 |倒序浏览
xml文档中有两所学校,我想循环出第一所学校里的学生($school_num =1),1ban里有3个人,2ban里有两个人,3ban里有两个人,但我现在的循环结果是:1ban里有3个人,2ban里有5个人,3ban里有7个人,请教各位我的问题出在哪儿?

#!/bin/perl
use strict;
use XML::Simple qw(XMLin);
#use YAML qw(Dump);

my @lines = <DATA>;
my $text = join '', @lines;
my $school_num =1;
my $xml_data   = XMLin( $text, ForceArray => 1 );
my ( $output, $reoutput, $student_text);
my $wen = "Welcome to Beijing sizhong!";
my $student_list = $xml_data->{school}[ $school_num - 1 ]->{student_list};
for my $student(@$student_list ){
          my $grade_info = $student->{grade_name}->[0];
    for my $student_info( @{$student->{student}} ){
        my $name = $student_info->{name}->[0];
        my $age = $student_info->{age}->[0];
        my $sex = $student_info->{sex}->[0];
        $student_text .= "$name($sex) is $age years old.\n";
    }
$output= <<END;
Hello!
We are in $grade_info.
$student_text$wen
Thank you!

END
$reoutput .=$output;
}
print $reoutput;


__DATA__
<?xml version="1.0" encoding="GBK"?>
<function funcname="3grades" mode="predefined">
  <task_name>2013815403777</task_name>
  <school>
    <school_name>Beijing sizhong</school_name>
    <student_list>
      <grade_name>1 ban</grade_name>
      <student>
        <name>Wang hongguang</name>
        <age>18</age>
        <sex>male</sex>
      </student>
      <student>
        <name>Song yujia</name>
        <age>19</age>
        <sex>female</sex>
      </student>
      <student>
        <name>Ma chunxiao</name>
        <age>20</age>
        <sex>male</sex>
      </student>
    </student_list>
    <student_list>
      <grade_name>2 ban</grade_name>
      <student>
              <name>Sun ying</name>
              <age>17</age>
              <sex>female</sex>
      </student>
      <student>
              <name>Wang fei</name>
              <age>19</age>
              <sex>male</sex>
      </student>
    </student_list>
    <student_list>
      <grade_name>3 ban</grade_name>
      <student>
              <name>Gao qian</name>
             <age>19</age>
              <sex>female</sex>
            </student>
            <student>
              <name>Shang caihong</name>
              <age>18</age>
              <sex>female</sex>
            </student>
    </student_list>
  </school>
  <school>
    <school_name>Huanggang yizhong</school_name>
    <student_list>
      <grade_name>4 ban</grade_name>
      <student>
              <name>Wang fuji</name>
             <age>21</age>
              <sex>male</sex>
            </student>
            <student>
              <name>Cheng lifang</name>
              <age>20</age>
              <sex>female</sex>
            </student>
    </student_list>
  </school>
</function>

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
2 [报告]
发表于 2013-11-19 10:47 |只看该作者
本帖最后由 pitonas 于 2013-11-19 04:04 编辑

改变1行
my ( $output, $reoutput, $student_text );
my ( $output, $reoutput );

加 1行
my $student_text;
  1.     my $grade_info = $student->{grade_name}->[0];
  2.     my $student_text;
  3.     for my $student_info ( @{ $student->{student} } ) {
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-11-19 11:01 |只看该作者
回复 2# pitonas

感谢,真是一针见血啊!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP