免费注册 查看新帖 |

Chinaunix

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

求助:perl 处理xml内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-13 16:14 |只看该作者 |倒序浏览
本帖最后由 rexuekonglong 于 2014-02-19 10:04 编辑

刚接触perl,需要用perl 解析、处理xml文件
result.xml 文件内容大概如下:
  1. <list>
  2.             <entry>            
  3.                  <author> zhangsan</author>
  4.                  <kind> add </kind>
  5.                  <filename>[color=Yellow] log4j.java[/color]</filename>
  6.                  <message>内容随意</message>
  7.                  <path>[color=Yellow]C:\code\[/color]</path>
  8.              </entry>
  9.              <entry>            
  10.                  <author> zhangsan</author>
  11.                  <kind>modified</kind>
  12.                  <filename> [color=Orange]log.txt[/color]</filename>
  13.                  <message>增加一个空格</message>
  14.                  <path>[color=Yellow]C:\code\[/color]</path>
  15.              </entry>
  16.              <entry>            
  17.                  <author> zhangsan</author>
  18.                  <kind>modified</kind>
  19.                  <filename>[color=Yellow] log4j.java[/color]</filename>
  20.                  <message>增加说明注释</message>
  21.                  <path>[color=Yellow]C:\code\[/color]</path>
  22.              </entry>           
  23.        </list>
复制代码
我想利用perl 处理这result.xml ,我的目的是实现,将第三个<entry>元素节点删除,因为它和第一个<entry>元素节点都展示的是同一个文件,
目前,我只做到,利用XMLin 读取result.xml 文件,并利用Dumper() 打印出xml内容,对于二次精简处理xml文件的方法不是很了解,
希望有人能给点建议,谢谢

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2014-02-14 00:32 |只看该作者
what is 第一个搜索结果 ?

论坛徽章:
0
3 [报告]
发表于 2014-02-14 08:48 |只看该作者
回复 2# rubyish
  1.      {              
  2.                  'author' => 'zhangsan',
  3.                  'kind' => 'add',
  4.                  'filename' => 'log4j.java',
  5.                  'message' => '内容随意。。。。'
  6.                  'path' => 'C:\code\'
  7.               }
复制代码
这是从搜索开始,显示的第一个结果,昨晚做了一下思路整理。
1、通过DOM将xml表示称节点树;
2、遍历第一个节点组并写入新xml文件;
3、遍历第二个节点组,将其<path>&&<filename> 子节点值对比,若value相同,则遍历第三个节点组;不同,则写入新xml


   

论坛徽章:
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
4 [报告]
发表于 2014-02-14 14:27 |只看该作者
什么意思,难以理解{:2_175:}

论坛徽章:
0
5 [报告]
发表于 2014-02-14 14:59 |只看该作者
回复 4# pitonas
我这是一个svn项目文件内容搜索功能页面,
这个搜索功能针对的是svn所有数据,同一个文件,不管这个文件被修改多少次,只要出现搜索关键字,就会被显示到最终结果页面中。
对于同一个文件(路径、名字一致),我不想让它显示多次,只希望它显示一次。


   

论坛徽章:
0
6 [报告]
发表于 2014-02-16 01:12 |只看该作者
用散列

论坛徽章:
0
7 [报告]
发表于 2014-02-17 09:11 |只看该作者
回复 6# fkiori
用散列,不是没有顺序的么?怎么让第一个小块{}中 <path><filename>  作为标准值,和剩下的小块{}中的   <path><filename> 对比呢?


   

论坛徽章:
0
8 [报告]
发表于 2014-02-17 09:57 |只看该作者
本身你xml有顺序啊,是数组啊。
循环数组,然后用散列过滤掉重复的。只保留第一个

论坛徽章:
0
9 [报告]
发表于 2014-02-17 11:30 |只看该作者
本帖最后由 rexuekonglong 于 2014-02-17 13:17 编辑

回复 8# fkiori


    我刚接触perl,以及perl中的xml,具体代码怎么写呢?
    书上说数据进入散列后是没有顺序的,那xml中的全部内容进入散列,还会保持它的顺序吗?
    还有就是我的要操作的xml非常类似我提出的那个样例,仅仅是一段xml块中的2个元素的值相同,才需要删除。
   
    具体的就是子节点中2个元素的值相同时,删除子节点(而此子节点有5个+的元素)。

论坛徽章:
0
10 [报告]
发表于 2014-02-19 10:28 |只看该作者
进过两天的研究,如果混合使用XML:OM,  XML:arser,XML::Simple,Data:umper
  1. use XML::DOM;
  2. use XML::Parser;
  3. my $parser =new XML::DOM::Parser;
  4. my $doc = $parser->parsefile("result.xml");
  5. my @nodes =$doc->getElementByTagName("entry");
  6. my @node=@nodes->getElementByTagName("path","filename");
  7. my $xml = new XML::Simple;
  8. foreach(@node){
  9.        if($_==$_[0])
  10.        {
  11.         @node->getParentNode->removeChild(@nodes);
  12.         my $data=$xml->XMLout($doc);
  13.         print Dumper($data);
  14.        }
  15.        else{
  16.       my $data=$xml->XMLin("result.xml");
  17.       print Dumper($data)
  18.      }      
  19. }
复制代码
我设想是根据对比子元素<path>,<filename> 值,若值相同,则删除<entry>节点,保留<path>,<filename> 值不同的<entry>节点。
然后将删除后的结果,返回xml文件,并解析出来。
是我返回xml语句有问题么?怎么结果显示,<entry>节点没有删除,且所有节点元素都变成了<undef>?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP