2013-02-09 7 views
0

XML 요소의 내용을 업데이트하려고합니다. XML :: LibXML을 사용하고 있으며이 라이브러리를 사용해야합니다. 다음은 몇 가지 샘플 데이터입니다. 내가하고 싶은 무엇Perl XML :: LibXML 업데이트 컨택

<data-table> 
    <data> 
     <number>1</number> 
     <letter>one</letter> 
    </data> 
    <data> 
     <number>2</number> 
     <letter>two</letter> 
    </data> 
</data-table> 

는 편지의 내용을 변경되는 수가 2. 그러나 나는 그것이 작동하기는 XPath를 지정하는 데 문제가있어 생각이다 "퍼플"합니다. 나는

내가 일 동안 고민 했어요 "에서"XML :: LibXML :: NodeList를 "패키지를 통해"사항 setData "개체 방법을 찾을 수 없습니다 것은"그래서 어떤 도움이 크게되는 다음과 같은 오류를 얻을 고맙습니다.

use XML::LibXML; 
    my $p = XML::LibXML->new; 
    my $d = $p->parse_fh(\*DATA); 
    for my $node ($d->findnodes('//data-table/data')) 
    { 
     for my $childNode ($node->findnodes('./number/text()')) 
     { 
      if($childNode->textContent() == '1') 
      { # here is where the problem is! 
      my $changeNumerNode = $node->findnodes('./letter/text()'); 
      $changeNumerNode->setData("Purple"); 
      } 
     } 
    } 
    print $d->toString; 

    __DATA__ 
    <data-table> 
     <data> 
     <number>1</number> 
     <letter>one</letter> 
     </data> 
     <data> 
     <number>2</number> 
     <letter>two</letter> 
     </data> 
    </data-table> 
+0

는'findnodes' 노드를 반환하지 않습니다 사용할 수

. 노드 또는 NodeList의 목록을 반환합니다. 링크 된 질문에 대한 답변을 참조하십시오. – ikegami

+0

감사합니다. 나는 내 수색에서 그것을 보았다. 노드를 삭제할 수는 없습니다. findnodes가 노드를 반환하지 않는다는 것을 알지만 노드를 가져온 후에 루프를 돌리고 있는데 왜 그 노드에서 하나의 작업을 수행 할 수 없습니까? 그것이 내가 이해하지 못하는 부분입니다. 또는 첫 번째 장소에서 올바른 방법으로 이동하십시오. 그렇다면 의 모든 하위 노드를 찾은 다음 일치 항목을 찾은 다음 의 모든 하위 노드를 다시 생성해야합니까? 그것은 나의 과도한 시나리오에서 효율적이지 않을 것입니다. – ScottEdge

+0

링크 된 게시물에서 노드를 얻는 방법을 보여주지 못했던 것 같습니다. – ikegami

답변

2

findnodes 노드를 반환하지 않습니다. 노드 목록이나 :: NodeList를 반환합니다. 목록을 반환하고 반환 된 첫 번째 노드를 가져갈 수 있습니다.

for my $node ($d->findnodes('//data-table/data')) 
{ 
    my ($number_node) = $node->findnodes('number') 
     or next; 
    $number_node->textContent() eq '1' 
     or next; 
    my ($letter_text) = $node->findnodes('letter/text()') 
     or next; 
    $letter_text->setData('Purple'); 
} 

은 (당신이 볼 수 있듯이, 나는 ./의 순수한 소음의 사용을 제거했습니다.) 심지어

for my $letter_text ($d->findnodes(
    '//data-table/data[number/text()="1"]/letter/text()')) 
{ 
    $letter_text->setData('Purple'); 
} 
+0

이 답변에 감사하지만 문서와 예제를 얼마나 오랫동안 읽었지만 두 번째 예제처럼 생각하지 않았습니다. – ScottEdge

+0

12 줄의 코드를 가져 와서 6 개로 만들었습니다. – ScottEdge

+0

XML :: LibXML은 XPath를 문서화하지 않습니다. 나는 정말로 2 ~ 3 라인이라고 부른다. – ikegami

관련 문제