2014-02-19 29 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

my $ xpathKportal = qq(// application [\ @ name =“$ applicationName”]/artifact [\ @ id =“$ artifactID”]/kportal); my $ var =“KPORTAL-1”; ($ manifestDoc-> findnodes($ xpathKportal)){ $ kportal_text-> appendText($ var);我的$ kportal_text($ manifestDoc-> findnodes($ xpathKportal)) } 我修改了我的代码到上面,它工作。 – user1470220

-1

有两种possbile错误:

你有一个错字:$ newdeploymentNode - > removeChildNodes();

并且可能您没有使用XML :: LibXML的最新版本,并且在此版本中不支持此方法调用。