我需要打印带有点的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";
}
}
任何人都可以查看,因为所有示例都包含了软件包和模块的使用,但我需要使用简单的逻辑执行它,而不需要函数。没有这样的例子,请建议。
答案 0 :(得分:2)
您的请求存在以下几个问题:
那不是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/\./;
}
答案 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";
}
}