Regex Perl脚本,用于遍历XML标记并列出其中包含点的所有标记
我需要打印带有点的XML标记。 示例:bg.tres、resume.pr 下面是我尝试过的代码,但在第一次匹配后就停止了。我试图首先提取标签,然后识别带有点的标签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
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”;
}
}
您的请求有几个问题:
xpath
是正则表达式的XML等价物。某种程度上。它是上下文的,允许您根据XML结构进行选择和匹配,区分内容、标记和属性@xml
,但它是单个值。所以不要使用标量foreach@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/\。/;
}
您的请求有几个问题:
xpath
是正则表达式的XML等价物。某种程度上。它是上下文的,允许您根据XML结构进行选择和匹配,区分内容、标记和属性@xml
,但它是单个值。所以不要使用标量foreach@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内置函数。所以我试着用普通的表达