-1

と を使用XML::SimpleしてXML::Dumperいます。前者のモジュールに関する問題は十分承知しています。別のライブラリを使用できる場合は、そうします。

私が達成したいのは、XML をロードし、それに行を追加することです。これは、スクリプトを実行する前の XML 構造です。

<person>
  <appearance>
     <param name="height" value="6,3"/>
  </appearence>
</person>

スクリプト、または私がコーディングしようとしていたものは、この XML をファイルからロードし、<param>要素を に追加する必要があります<appearence>。私はこのコードを使用してそれを試みました:

use warnings;

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

my $xml = XMLin('xml_import.xml');

$xml->{appearence} .= qq{<param name="age" value="22" />};
my $new_xml = XMLout($xml, noattr => 1, NoEscape => 1);

open(FILE, ">xml_import.xml");
print FILE $new_xml;
close FILE;

残念ながら、出力は次のとおりです。

<opt>
  <appearence>HASH(0x1722190)<param name="age" value="22" /></appearence>
</opt>

<person>元のタグを失うだけでなく<opt>、その文字列は、既存の要素HASHであると想定しているものを置き換えます。<param>のドキュメントを読みましたXML::Simpleが、これを防ぐためにどの引数を使用する必要があるかわかりません。

4

2 に答える 2

2

XML::Simpleを使用するポイントは、コードで XML ではなく Perl データ構造を使用することです。

あなたの問題は、モジュールが推奨されない理由を正確に示しています。ForceArray親の要素の数を簡単に変更できるようにするために使用する必要があり、属性KeyAttrの特別な処理をブロックするにはクリアする必要があります。name

#!/usr/bin/perl
use warnings;
use strict;

use XML::Simple;

my $xml = << '__XML__';
<person>
  <appearance>
     <param name="height" value="6,3"/>
  </appearance>
</person>
__XML__

my $simple = XMLin($xml, ForceArray => 1,
                         KeepRoot   => 1,
                         KeyAttr    => [],
                  );

push @{ $simple->{person}[0]{appearance}[0]{param} }, { name  => 'age',
                                                        value => 22,
                                                      };
print XMLout($simple, KeepRoot => 1);

比較のために、XML::LibXMLのラッパーであるXML ::XSH2 の同じタスク:

open file.xml ;
my $p := insert element param append /person/appearance ;
set $p/@name 'age' ;
set $p/@value 22 ;
save :b ;
于 2015-10-16T12:53:56.830 に答える
0

1. タグを失う理由は、「XMLin() は通常、ルート要素名を破棄します。'KeepRoot' オプションを '1' に設定すると、ルート要素名が保持されます。」

2.ファイルから xml を読み取った後、変数を perl データ構造として操作する必要があります。

#! /usr/bin/perl

use strict;
use XML::Simple qw(:strict);
use Data::Dumper;

my $xml = XMLin('xml_import.xml', KeepRoot => 1, KeyAttr => ["param"], ForceArray => ["param"]);
print '-----$xml-----', "\n", Dumper($xml), "\n";

my $new_node = {'name' => 'age', 'value' => '22'};
push $xml->{person}->{appearance}->{param}, $new_node;
print '-----Insert a new node to $xml-----', "\n", Dumper($xml), "\n";

my $new_xml = XMLout($xml, NoAttr => 1, NoEscape => 1, KeepRoot => 1, KeyAttr => []);
print '-----$new_xml-----', "\n", $new_xml, "\n";

または

#! /usr/bin/perl

use strict;
use XML::Simple qw(:strict);
use Data::Dumper;

my $xml = XMLin('xml_import.xml', KeepRoot => 1, KeyAttr => {param => "+name"}, ForceArray => ["param"]);
print '-----$xml-----', "\n", Dumper($xml), "\n";

my $new_node = {'name' => 'age', 'value' => '22'};
$xml->{person}->{appearance}->{param}->{age} = $new_node;
print '-----Insert a new node to $xml-----', "\n", Dumper($xml), "\n";

my $new_xml = XMLout($xml, NoAttr => 1, NoEscape => 1, KeepRoot => 1, KeyAttr => {param => "+name"});
print '-----$new_xml-----', "\n", $new_xml, "\n";
于 2015-10-16T14:09:43.450 に答える