1

例如,我有一个 xml 文件,

<title> hello <name> hi </name> <street> id </street> this is xml file </title>

这里的父节点是title。我将提取父节点内的文本,删除内部标签。

我已经尝试过使用正则表达式。但是除了使用正则表达式之外,还有什么方法可以使用一些基于 xml 的函数来删除标签。注意:标签名称事先不知道。

嗨,我试过了,我使用了相同的 xml

use XML::Simple; 
use Data::Dumper; 

my $simple = XML::Simple->new(); 
my $data = $simple->XMLin('XMLRemoval.xml'); 
my %oldHash = %$data; my %newHash = (); 

while ( my ($key, $innerRef) = each %oldHash ) 
{ 
    $newHash{$key} = @$innerRef[1]; 
} 

foreach $key ( keys %newHash ) 
{ 
    print $newHash{$key}; 
}

我得到了错误:不能使用字符串(“id”)作为数组引用,而“严格引用”

4

4 回答 4

1
use strict;
use warnings;

use features qw/say/;
use Mojo::DOM;

my $dom = Mojo::DOM->new('<title> hello <name> hi </name> <street> id </street> this is xml file </title>');

say $dom->all_text;
# hello hi id this is xml file

say $dom->at('title')->all_text;
# hello

你明白了

于 2012-10-26T12:37:24.273 回答
1

根据你的要求,你可以试试这个。我在示例中使用了您提供的文件。

我们在这里定义 XML 中的根密钥内容(或重命名),您需要选择一个不在您的 XML 中的密钥(我选择了根内容)。

#!/usr/bin/perl
use strict;
use XML::Simple;
use Data::Dumper;
my $key;
my $simple = XML::Simple->new();
my $data = $simple->XMLin('XMLRemoval.xml', 'ContentKey' => 'root-contents');
print Dumper $data;
my $val = $data->{'root-contents'};
if(ref($val) =~ /Array/i)
{
    foreach (@$val)
    {
        print "$_\n";
    }
}
else
{
    print "$val\n";
}

请阅读 XML::Simple 文档,有很多选项可以根据您的要求进行调整。

我会将调试部分留给您,让您的代码检查错误是什么以及如何解决它(这本身就是解释性的):)。

于 2012-10-29T06:31:45.720 回答
0

您可以使用XML::XSH2

open file.xml ;
echo (/title) ;       # hello  hi   id  this is xml file
echo /title/text() ;  # hello     this is xml file 
于 2012-10-26T11:16:44.403 回答
0

最残忍的方式是:

use strict;
use warnings;

use feature 'say';


my $text = '<title> hello <name> hi </name> <street> id </street> this is xml file </title>' ;

$text =~ s|<.+?>||g;
say "Text |$text|";

但是,您可能知道,用 regex 解析 html不行

于 2012-10-26T11:36:21.583 回答