2012-02-09 5 views
4

XML :: LibXMLで値を更新すると、最初の2行が削除されます。 更新された値を除いて、XMLをそのまま保存したい。XML :: LibXMLは、XMLへの書き込み時に見出しを削除します。

....

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 
<configuration> 
<property> 
    <name>test.name</name> 
    <value>help</value> 
    <description>xml issue</description> 
</property> 

、コードは次のとおりです:

私の元のXMLがある

my $parser =XML::LibXML->new(); 
my $tree =$parser->parse_file($file) or die $!; 
my $root =$tree->getDocumentElement; 

my $searchPath="/configuration/property[name=\"$name\"]/value/text()"; 
my ($val)=$root->findnodes($searchPath); 

$val->setData($new_val); 
open (UPDXML, "> $file") or die "ERROR: Failed to write into $file..."; 
print UPDXML $root->toString(1); 
close (UPDXML); 

私は、印刷UPDXML $ root-> toStringC14N(1)を試みたが、役に立たない...

答えて

5

答えをdaximとrpgの両方で行いますが、強調するには$root->toString()の代わりに$tree->toString()を使用してファイル全体を取得してください。

1

試してみてください

$tree->toFile ($file); 
3

toFile in XML::LibXML::Documentを参照してください。作業しているソフトウェアのドキュメントをお読みください。

use strictures; 
use XML::LibXML qw(); 
my $file = 'fnord.xml'; 
my $name = 'test.name'; 
my $new_val = 'foo'; 

my $parser = XML::LibXML->new; 
my $tree = $parser->parse_file($file); 
my $root = $tree->getDocumentElement; 

my $searchPath = "/configuration/property[name='$name']/value/text()"; 
my ($val)  = $root->findnodes($searchPath); 

$val->setData($new_val); 
$tree->toFile($file); 

ファイルルーチンは自動的に例外を発生させます。従来のPerlエラーチェックの必要はありません。

+0

10x。 cpanはtoStringと同じだが大容量のファイルを扱うときは良いと述べているので、試してみませんでした。 –

関連する問題