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}; 
}

そして、エラーが発生します: "strict refs"の間、文字列( "id")をARRAYrefとして使用できません

4

4 に答える 4

1

要件に基づいて、これを試すことができます。例では、あなたから提供されたファイルを使用しました。

ここでは XML でルート キーの内容を定義しています (または名前を変更しています)。XML に含まれないキーを選択する必要があります (root-contents を選択しました)。

#!/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 に答える
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 に答える
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|";

しかし、ご存じのとおり、html を regexで解析することできません

于 2012-10-26T11:36:21.583 に答える