2014-02-19 3 views
0

файл XML выглядит следующим образомPerl XML :: LibXML - не может заменить Заменить значение элемента

<?xml version="1.0"?> 
<application name="pos"> 
    <artifact id="example.war" type="war" cycle="ReleaseX-Sprint1"> 
    <jira>tick-1,tick-2,</jira> 
    <jenkins>http://localhost:0000/hudson</jenkins> 
    <kportal/> 
    <scm> 
     <transaction id="111" user="user1"> 
     <file name="a/b/c/d.txt"/> 
     <file name="x/y/z.xml"/> 
     </transaction> 
    </scm> 
    </artifact> 
</application> 

Я хочу, чтобы добавить значение в kportal узла для конкретного артефакта узла так, что он выглядит как <kportal>KPORTAL-1</kportal>

Мой код выглядит следующим образом

my $manifestDoc = $manifestFileParser->parse_file($manifestFile); 
my $xpathKportal = qq(//application[\@name="$applicationName"]/artifact[\@id="$artifactID"]/kportal); 
my $newdeploymentNode = $manifestDoc->findnodes($xpathKportal); 
$newdeploymentNode->removeChildNodes(); 
$newdeploymentNode->appendText('KPORTAL-1'); 

я получаю ошибку

Can't locate object method "removeChildNodes" via package "XML::LibXML::NodeList" 

ответ

1

XML::LibXML::Node::findnodes возвращает объект NodeList в скалярном контексте, но список узлов в контексте списка. NodeList не имеет метода removeChildNodes. Предлагаемое решение: используйте список с левой стороны от =, чтобы вызвать контекст списка.

my ($new_deployment_node) = $manifest_doc->findnodes(...); 
+0

мой $ xpathKportal = кв.кв (// приложение [\ @ имя = "$ ApplicationName"]/артефакт [\ @ ид = "$ артефакта"]/kportal); my $ var = "KPORTAL-1"; для моего $ kportal_text ($ manifestDoc-> findnodes ($ xpathKportal)) { $ kportal_text-> appendText ($ var); } Я изменил свой код на предыдущий, и он сработал. – user1470220

-1

Есть два possbile ошибки:

У вас есть опечатка: $ newdeploymentNode -> removeChildNodes();

и, возможно, вы не используете последнюю версию XML :: LibXML, и в этой версии этот вызов метода не поддерживается.

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