2014-02-19 1 views
0
XML 파일 내가 특정 유물 노드 그래서 <kportal>KPORTAL-1</kportal>

펄 XML :: LibXML - 요소 값을 대체 대체 할 수

처럼 보이는 것을 위해 kportal 노드에 값을 추가하려면이

<?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> 

처럼 보이는

내 코드는이

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'); 

나는 오류

,369을 얻고있다처럼 보인다 이 possbile 오류가 있습니다
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에"@]/유물 [\ ID = "$ artifactId를"@]/kportal); my $ var = "KPORTAL-1"; for my $ kportal_text ($ manifestDoc-> findnodes ($ xpathKportal)) { $ kportal_text-> appendText ($ var); } 위 코드를 수정하여 올바르게 작동합니다. – user1470220

-1

:

당신은 오타가 : $ newdeploymentNode -> removeChildNodes를();

그리고 아마도 XML :: LibXML의 최신 버전을 사용하고 있지 않을 수 있으며이 버전에서는이 메소드 호출이 지원되지 않습니다.