Perl脚本遍历XML标记并列出其中包含点的所有标记

时间:2017-04-19 07:59:40

标签: regex xml perl

我需要打印带有点的XML标签。 示例:bg.tres,resume.pr 下面是我尝试的代码,但它在第一场比赛后停止了。我试图首先提取标签,然后识别其中有点的标签。

my $xml = q~<?xml version='1.0'?>
<bg.tres>
 <resume.key='267298871' score='5'>
  <xpath path='xpath://resume'>
   <resume.pr canonversion='2' dateversion='2' present='734060'>
   </resume.pr>
  </xpath>
 </resume>
</bg.tres>~;

 #print $xml,$/;
 foreach $line($xml)
 {
    if($line =~ m/<(.*?)>/)
    {
        print "$1\n";
    }
}

任何人都可以查看,因为所有示例都包含了软件包和模块的使用,但我需要使用简单的逻辑执行它,而不需要函数。没有这样的例子,请建议。

2 个答案:

答案 0 :(得分:2)

您的请求存在以下几个问题:

  1. 那不是XML。如果这确实是您的源XML,我建议您使用XML规范的卷起副本,然后点击给谁。因为格式错误的XML 应该是致命的

  2. XML是上下文的。正则表达式不是。因此,使用正则表达式解析XML非常复杂(它不是相当不可能,但它很难)。

  3. xpath是正则表达式的XML等价物。有点。它是上下文的,允许您根据XML结构进行选择和匹配,区分内容,标签和属性。

  4. 解析器使工作变得轻松。使用解析器。

  5. 您已将文字插入数组@xml,但它只是一个值。所以不要使用标量。 foreach @xml并没有按照您的想法行事,因为@xml中只有一个元素。

  6. 因此,考虑到这一点 - 并且将制作所需的XML修复为有效的XML:

    #!/usr/bin/env perl;
    use strict;
    use warnings;
    
    use XML::Twig;
    
    my $src = q~<?xml version='1.0'?>
    <bg.tres>
     <resume.key key='267298871' score='5'>
      <xpath path='xpath://resume'>
       <resume.pr canonversion='2' dateversion='2' present='734060'>
       </resume.pr>
      </xpath>
     </resume.key>
    </bg.tres>~;
    
    my $xml = XML::Twig -> parse ( $src ); 
    
    foreach my $node ( $xml -> get_xpath ('//*') ) {
       print $node -> tag,"\n" if $node -> tag =~ m/\./;
    }
    

答案 1 :(得分:-1)

在@xml中,您只有一行,因此正则表达式无效。

你需要拆分你的字符串。

在$ xml中重命名@xml,然后

my @xml = split(/\n/,$xml);

if ($line =~ m/<([^>]+(?=\.)[^>]+)>/) 

此代码适用于我:

my $xml = q~<?xml version='1.0'?>
<bg.tres>
 <resume.key='267298871' score='5'>
  <xpath path='xpath://resume'>
   <resume.pr canonversion='2' dateversion='2' present='734060'>
   </resume.pr>
  </xpath>
 </resume>
</bg.tres>~;


 #print $xml,$/;
my @xml = split(/\n/,$xml);

 foreach $line(@xml)
 {
    if($line =~ m/<([^>]+(?=\.)[^>]+)>/)
    {
        print "$1\n";
    }
}