Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl脚本,用于遍历XML标记并列出其中包含点的所有标记_Regex_Xml_Perl - Fatal编程技术网

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

Regex Perl脚本,用于遍历XML标记并列出其中包含点的所有标记,regex,xml,perl,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

我需要打印带有点的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";
    }
}
my$xml=q~
~;
#打印$xml,$/;
foreach$行($xml)
{
如果($line=~m//)
{
打印“$1\n”;
}
}

任何人都可以回顾一下,因为所有的例子都有包和模块的使用,但是我需要用简单的逻辑来执行,没有函数。没有这样的例子,请建议。

在@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";
    }
}
my$xml=q~
~;
#打印$xml,$/;
my@xml=split(/\n/,$xml);
foreach$行(@xml)
{
如果($line=~m/]+(?=\)[^>]+)>/)
{
打印“$1\n”;
}
}

在@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";
    }
}
my$xml=q~
~;
#打印$xml,$/;
my@xml=split(/\n/,$xml);
foreach$行(@xml)
{
如果($line=~m/]+(?=\)[^>]+)>/)
{
打印“$1\n”;
}
}

您的请求有几个问题:

  • 这不是XML。如果这真的是您的源XML,我建议您去用XML规范的卷起来副本攻击给您的人,因为格式错误的XML应该是致命的

  • XML是上下文的。正则表达式不是。因此,用正则表达式解析XML非常复杂(这不是完全不可能,但很难)

  • xpath
    是正则表达式的XML等价物。某种程度上。它是上下文的,允许您根据XML结构进行选择和匹配,区分内容、标记和属性

  • 解析器使工作变得简单。使用解析器

  • 您正在将文本插入数组
    @xml
    ,但它是单个值。所以不要使用标量
    foreach@xml
    没有做您认为它在做的事情,因为
    @xml
    中只有一个元素

  • 因此,请牢记这一点,并尽可能少地修改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/\./;
    }
    
    #/usr/bin/env-perl;
    严格使用;
    使用警告;
    使用XML::Twig;
    我的$src=q~
    ~;
    my$xml=xml::Twig->parse($src);
    foreach my$node($xml->get_xpath('/*')){
    打印$node->tag,“\n”如果$node->tag=~m/\。/;
    }
    
    您的请求有几个问题:

  • 这不是XML。如果这真的是您的源XML,我建议您去用XML规范的卷起来副本攻击给您的人,因为格式错误的XML应该是致命的

  • XML是上下文的。正则表达式不是。因此,用正则表达式解析XML非常复杂(这不是完全不可能,但很难)

  • xpath
    是正则表达式的XML等价物。某种程度上。它是上下文的,允许您根据XML结构进行选择和匹配,区分内容、标记和属性

  • 解析器使工作变得简单。使用解析器

  • 您正在将文本插入数组
    @xml
    ,但它是单个值。所以不要使用标量
    foreach@xml
    没有做您认为它在做的事情,因为
    @xml
    中只有一个元素

  • 因此,请牢记这一点,并尽可能少地修改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/\./;
    }
    
    #/usr/bin/env-perl;
    严格使用;
    使用警告;
    使用XML::Twig;
    我的$src=q~
    ~;
    my$xml=xml::Twig->parse($src);
    foreach my$node($xml->get_xpath('/*')){
    打印$node->tag,“\n”如果$node->tag=~m/\。/;
    }
    
    使用看起来不像格式良好的XML的XML解析器?您考虑过使用格式良好的XML和XML解析器吗?有两个问题:a)这不是XML。b) 如果它是XML,那么用正则表达式解析它就非常重要,因为XML是上下文的,而正则表达式不是上下文的。c) 有一些模块是XML解析器。您应该使用一个。使用看起来不像格式良好的XML的XML解析器?您考虑过使用格式良好的XML和XML解析器吗?有两个问题:a)这不是XML。b) 如果它是XML,那么用正则表达式解析它就非常重要,因为XML是上下文的,而正则表达式不是上下文的。c) 有一些模块是XML解析器。实际需求是,我有一个XML文件,必须列出所有带有(.)点的标记,而不使用解析器或任何XML构建函数。所以我试着通过正则表达式来实现。但正如您所提到的,它非常复杂,您能推荐任何简单的逻辑吗,比如使用字符串函数或其他任何东西,而不是解析器。没有“简单逻辑”,因为XML没有那么简单。对于需要解析器的东西不使用解析器,意味着您需要自己编写解析器。所以也许去看看XML::Twig的源代码吧?(提示:这也相当复杂)您是说需要在不使用XML解析器的情况下处理XML?这有点像不用扳手拧紧螺母的要求。用错误的工具做某事的要求是你应该放弃的。我倾向于用“用锤子拧螺丝”的比喻。我是说,从技术上讲你可以。但结果是混乱和不可靠的,螺丝刀也不难获得。实际需求是,我有一个XML文件,必须列出所有带有(.)点的标记,而不使用解析器或任何XML内置函数。所以我试着用普通的表达