2012-02-09 2 views
4

XML :: LibXML로 값을 업데이트하면 처음 두 줄이 제거됩니다. 하나의 업데이트 된 값을 제외하고 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 $ 루트 레벨> 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과 같지만 큰 파일로 작업 할 때 좋기 때문에 시도하지 않았습니다. –