2014-02-16 2 views
1

Perl을 사용하여 XML 속성을 변경하려고합니다.Perl XML : LibXML setAttribute가 문서를 변경하지 않습니다.

XML 파일은 다음과 같습니다

<Node> 
    <NodeX attr1="1" attr2="2" attr3="3"/> 
</Node> 

펄 스크립트가 포함되어 스크립트가 속성을 변경하지 않는 결과

my @nodes = $doc->findnodes("//Node/Nodex");; 
if (@nodes) { 
    my $res = $nodes[0]->hasAttribute("attr3"); 
    if ($res) { 
    foreach (@nodes) { 
     $_->setAttribute('attr3', "10"); 
    } 
    } 
} 

으로. 이미 사용 권한을 테스트했으며 스크립트는 print을 사용하여 XML 파일을 읽고 쓸 수 있습니다.

setAttributehasAttribute이 true를 반환 함에도 불구하고 전혀 아무 것도하지 않는 것처럼 보입니다.

+0

어떻게 속성이 변경되지 않았 음을 확인합니까? XML을 어디서 출력합니까? 문서의 다른 측면을 바꿀 수 있습니까? – amon

+0

일단 스크립트가 완료되면 XML 파일을 읽습니다. 나머지 문서는 XSLT에서 처리되고 나머지 모든 속성은 XSLT에 지정된 함수에 따라 설정됩니다. 다른 질문? –

+0

파일을 DOM으로 파싱하여 DOM을 변경했지만 변경된 DOM을 파일에 다시 쓰는 것을 잊어 버렸습니까? – tobyink

답변

2

노드의 이름은 NodeX이며 Nodex이 아닙니다. 그게 전부 당신의 코드에 잘못된 것입니다 (귀하의 의견에서, 그것은 파일에 변경된 XML을 쓰지 않을 수도 있습니다)하지만 이것은 당신이 선호하는 더 간결한 방법을 보여줍니다.

use strict; 
use warnings; 

use XML::LibXML; 

my $doc = XML::LibXML->load_xml(string => <<'__END_XML__'); 
<Node> 
    <NodeX attr1="1" attr2="2" attr3="3"/> 
</Node> 
__END_XML__ 

my ($attr) = $doc->findnodes('/Node/NodeX/@attr3'); 

$attr->setValue(10) if $attr; 

print $doc->toString; 

출력

<?xml version="1.0"?> 
<Node> 
    <NodeX attr1="1" attr2="2" attr3="10"/> 
</Node> 
+0

답변 해 주셔서 감사합니다. 문제는 귀하가 언급 한 바로 그 두 번째 변경 사항을 다시 쓰는 것이 아닙니다. 나는 (잘못) setAttribute()가 나를 위해 그것을했을 것이라고 생각했다. –

관련 문제