Board logo

标题: [文本处理] 批处理提取多个xml中指定标签之间的行内容合并输出到同一个新的xml指定标签里 [打印本页]

作者: seeya    时间: 2016-11-9 10:53     标题: 批处理提取多个xml中指定标签之间的行内容合并输出到同一个新的xml指定标签里

因为是多个xml(有时可能1000多个以上),所以自己用for循环尝试弄了下,奈何能力不够,七拼八凑的没有用,所以这里求大神帮忙!!!
情况如下(已略去示例xml中不必要的内容),原xml已上传附件:
  1. <详情>
  2. <ie>
  3. <BB1>Help1</BB1>
  4. <CC1>Help2</CC1>
  5. <DD1>Help3</DD1>
  6. <EE1>Help4</EE1>
  7. </ie>
  8. </详情>
复制代码
  1. <详情>
  2. <ie>
  3. <BB1>Help5</BB1>
  4. <CC1>Help6</CC1>
  5. <DD1>Help7</DD1>
  6. <EE1>Help8</EE1>
  7. </ie>
  8. </详情>
复制代码
  1. <详情>
  2. <ie>
  3. <BB1>Help9</BB1>
  4. <CC1>Help10</CC1>
  5. <DD1>Help11</DD1>
  6. <EE1>Help12</EE1>
  7. </ie>
  8. </详情>
复制代码
将这个3个示例xml文本批处理为这样的形式
  1. <详情>
  2. <ie>
  3. <BB1>Help1</BB1>
  4. <CC1>Help2</CC1>
  5. <DD1>Help3</DD1>
  6. <EE1>Help4</EE1>
  7. </ie>
  8. <ie>
  9. <BB1>Help5</BB1>
  10. <CC1>Help6</CC1>
  11. <DD1>Help7</DD1>
  12. <EE1>Help8</EE1>
  13. </ie>
  14. <ie>
  15. <BB1>Help9</BB1>
  16. <CC1>Help10</CC1>
  17. <DD1>Help11</DD1>
  18. <EE1>Help12</EE1>
  19. </ie>
  20. </详情>
复制代码
也就是把所有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命令可以用很短的代码完成这个任务
  1. use v5.16;
  2. our $s="";
  3. grep
  4. {
  5.     $s .= abstract( "Ai_${_}.xml" );
  6. }
  7. (1..3);    # 编号,请自行修改
  8. MAKE_XML:
  9. {
  10.     my $all;
  11.     load( "Ai_1.xml" , \$all);       # 以 Ai_1.xml 为模板
  12.     $all =~s/<ie>.+<\/ie>/$s/sg;
  13.     open my $WRT, ">:raw", "Ai_all_test.xml";
  14.     print $WRT $all;
  15.     close $WRT;
  16. }
  17. sub abstract
  18. {
  19.     my $all;
  20.     load(shift, \$all);
  21.     $all =~/<ie>.+<\/ie>/s;
  22.     return $&;
  23. }
  24. sub load
  25. {
  26.     my ($f, $ref) = (shift, shift);
  27.     open my $READ, "<:raw", $f or die "$!";
  28.     {
  29.         local $/ = undef;
  30.         $$ref    = <$READ>;
  31.     }
  32.     close $READ;
  33. }
复制代码

作者: pcl_test    时间: 2016-11-9 15:54

本帖最后由 pcl_test 于 2016-11-9 16:05 编辑
  1. @echo off
  2. rem win7及以上系统运行,已排除Ai_all.xml
  3. 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"
  4. pause
复制代码

作者: seeya    时间: 2016-11-9 17:07

回复 3# pcl_test
谢谢版主大大!大概能懂代码意思,到时候xml记号改了也能很方便修改
作者: seeya    时间: 2016-11-9 18:05

回复 2# 523066680

非常感谢!
开始以为是和.bat 一样的直接运行就行了,但发现是窗口一闪而过。后来仔细看了版主开始就说了是Perl。开始不知道是什么,百度了后才知道要安装Activeperl,才能用。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2