标题: [文本处理] 批处理提取多个xml中指定标签之间的行内容合并输出到同一个新的xml指定标签里 [打印本页]
作者: seeya 时间: 2016-11-9 10:53 标题: 批处理提取多个xml中指定标签之间的行内容合并输出到同一个新的xml指定标签里
因为是多个xml(有时可能1000多个以上),所以自己用for循环尝试弄了下,奈何能力不够,七拼八凑的没有用,所以这里求大神帮忙!!!
情况如下(已略去示例xml中不必要的内容),原xml已上传附件:- <详情>
- <ie>
- <BB1>Help1</BB1>
- <CC1>Help2</CC1>
- <DD1>Help3</DD1>
- <EE1>Help4</EE1>
- </ie>
- </详情>
复制代码
- <详情>
- <ie>
- <BB1>Help5</BB1>
- <CC1>Help6</CC1>
- <DD1>Help7</DD1>
- <EE1>Help8</EE1>
- </ie>
- </详情>
复制代码
- <详情>
- <ie>
- <BB1>Help9</BB1>
- <CC1>Help10</CC1>
- <DD1>Help11</DD1>
- <EE1>Help12</EE1>
- </ie>
- </详情>
复制代码
将这个3个示例xml文本批处理为这样的形式- <详情>
- <ie>
- <BB1>Help1</BB1>
- <CC1>Help2</CC1>
- <DD1>Help3</DD1>
- <EE1>Help4</EE1>
- </ie>
- <ie>
- <BB1>Help5</BB1>
- <CC1>Help6</CC1>
- <DD1>Help7</DD1>
- <EE1>Help8</EE1>
- </ie>
- <ie>
- <BB1>Help9</BB1>
- <CC1>Help10</CC1>
- <DD1>Help11</DD1>
- <EE1>Help12</EE1>
- </ie>
- </详情>
复制代码
也就是把所有xml中<详情>记号内的内容批量复制到新的xml<详情>记号中。
xml的格式都是一致的,不过记号内的url,创建时间,会有不同。
作者: 523066680 时间: 2016-11-9 14:55
本帖最后由 523066680 于 2016-11-9 15:16 编辑
Perl,作为对比,生成的文件名用Ai_all_test.xml,和楼主给出的Ai_all.xml做了diff,没有查出异同。
可能组合使用一些shell命令可以用很短的代码完成这个任务- use v5.16;
-
- our $s="";
-
- grep
- {
- $s .= abstract( "Ai_${_}.xml" );
- }
- (1..3); # 编号,请自行修改
-
- MAKE_XML:
- {
- my $all;
-
- load( "Ai_1.xml" , \$all); # 以 Ai_1.xml 为模板
- $all =~s/<ie>.+<\/ie>/$s/sg;
-
- open my $WRT, ">:raw", "Ai_all_test.xml";
- print $WRT $all;
- close $WRT;
- }
-
- sub abstract
- {
- my $all;
- load(shift, \$all);
- $all =~/<ie>.+<\/ie>/s;
- return $&;
- }
-
- sub load
- {
- my ($f, $ref) = (shift, shift);
- open my $READ, "<:raw", $f or die "$!";
- {
- local $/ = undef;
- $$ref = <$READ>;
- }
- close $READ;
- }
复制代码
作者: pcl_test 时间: 2016-11-9 15:54
本帖最后由 pcl_test 于 2016-11-9 16:05 编辑
- @echo off
- rem win7及以上系统运行,已排除Ai_all.xml
- powershell -c "$a='';$b=dir *.xml -exclude *_all.xml;0..($b.length-2)|%%{if([IO.File]::ReadAllText($b[$_], [Text.Encoding]::utf8) -match '(?<=<详情>)[\s\S]+(?=<\/详情>)'){$a+=$matches[0]}};[IO.File]::ReadAllText($b[-1], [Text.Encoding]::utf8) -replace '(?<=<详情>)',$a|out-file '$result_all.xml' -encoding utf8"
- pause
复制代码
作者: seeya 时间: 2016-11-9 17:07
回复 3# pcl_test
谢谢版主大大!大概能懂代码意思,到时候xml记号改了也能很方便修改
作者: seeya 时间: 2016-11-9 18:05
回复 2# 523066680
非常感谢!
开始以为是和.bat 一样的直接运行就行了,但发现是窗口一闪而过。后来仔细看了版主开始就说了是Perl。开始不知道是什么,百度了后才知道要安装Activeperl,才能用。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |