2014-02-16 4 views
1

Я пытаюсь изменить атрибут XML с помощью Perl.Perl XML: LibXML setAttribute не меняет документ

XML-файл выглядит следующим образом:

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

сценарий Perl содержит:

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

В результате сценарий не изменяет атрибут. Я уже протестировал разрешения, и сценарий может писать и читать XML-файл, используя print.

setAttribute, кажется, ничего не делает, несмотря на то, что hasAttribute возвращает 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() сделал бы это для меня. –

Смежные вопросы