免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4809 | 回复: 13

Perl 或者shell 读取xml 文件 [复制链接]

论坛徽章:
0
发表于 2011-09-30 13:19 |显示全部楼层
39_123.xml
<?xml version="1.0" encoding="UTF-8"?>
<?Siebel-Property-Set EscapeNames="false"?>
<TaskListInformation>
        <ListOfFtPSalesReportIo>
                <RHeader>
                        <RId>1-258ZE-449</RId>
                        <RName>第39周 销售报告</RName>
                        <OName>電盈沙田新城</OName>
                        <Wk>39</Wk>
                        <Day>1</Day>
                        <Caloffset>0</Caloffset>
                        <DF1>1-NC4TP6</DF1>
                        <DF2>1-MH8N6V</DF2>
                </RHeader>
        <ListOfFtWorkPlansIo/>
</TaskListInformation>

如何解析成如下格式
30_123.xml Rid 1-258ZE-449

论坛徽章:
0
发表于 2011-09-30 13:25 |显示全部楼层
逐行读入,正则匹配

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2011-09-30 13:43 |显示全部楼层
用正则表达式也太业余了吧,明明有专门处理 xml 的工具

论坛徽章:
0
发表于 2011-09-30 13:44 |显示全部楼层
回复 3# zhlong8


    你委婉点嘛,55555555555555

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2011-09-30 14:38 |显示全部楼层
回复  zhlong8


       你委婉点嘛,55555555555555
sosflyer 发表于 2011-09-30 13:44



    主要像 xml 这种复杂的结构想写个完美的正则出来是相当难的,就像书中说的那样用正则那你现在就有两个问题了

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
发表于 2011-09-30 21:38 |显示全部楼层
本帖最后由 iakuf 于 2011-09-30 21:39 编辑
  1. perl -MData::Dumper -MXML::Simple -le  'print XMLin(shift)->{ListOfFtPSalesReportIo}{RHeader}{RId};' 39.xml
复制代码
下面这一对 xml 的标签是对不上号的
<ListOfFtPSalesReportIo>
<ListOfFtWorkPlansIo/>

论坛徽章:
0
发表于 2012-05-09 17:49 |显示全部楼层
回复 6# iakuf


    3Q...我是直接当成文本文件读取 然后查找特定的字符了


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

my $dirname = $ARGV[0];

print "Rid\tDF1\tDF2\n";
# Get all XML file from the specified folder
opendir(DIR, $dirname) or die "can't opendir $dirname: $!";
while (defined($file = readdir(DIR))) {
    # do something with "$dirname/$file"
    if($file =~ /xml$/){
            #print $dirname.'\\'.$file, "\n";
            readInfo($dirname.'\\'.$file);
        }
}

closedir(DIR);


exit;

# Get content from the file
sub readInfo{
        my $f = shift;
       
        my $F;
       
        open($F, $f) || die "open $f failed";
       
        my $idx = 0;
        while(<$F>){
                chmod;
                my $str = $_;
                if($str =~ m/>(.*)<\/Rid/i){ # >1-25900-309</RId
                        print $1;
                                       
                        $idx++;
                }elsif($str =~ m/>(.*)<\/DF1/i){ # >1-NC4TP6</DF1
                        print "\t",$1;                       
                        $idx++;
                }elsif($str =~ m/>(.*)<\/DF2/i){ # >1-NC4TP6</DF1
                        print "\t",$1;
                        $idx++;
                }
               
                last if($idx == 3);
               
        }
       
        print "\n";
        close($F);
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-05-09 18:24 |显示全部楼层
vallygirl 发表于 2012-05-09 17:49
回复 6# iakuf


如果取得RId的值1-258ZE-449是你的需求,那就应该用XPATH,简单的表达式“//RId”可以取代你所有的代码。

用这个模块XML::LibXML,如果批量操作,这个模块的效率是最高的。

你的所有代码可以写成2行,第一行用XML::LibXML读入XML,第二行用XPATH取得你要的值。

论坛徽章:
0
发表于 2012-05-09 18:27 |显示全部楼层

论坛徽章:
0
发表于 2012-05-09 21:06 |显示全部楼层
看来大牛们也都青睐XML::Simple hoho~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP