2013-02-09 96 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 ::節點列表」無法找到對象的方法’使用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 2013-02-09 23:24:54

+0

謝謝。我在我的搜索中看到了這一點。但我也無法刪除節點。我意識到findnodes不會返回一個節點,但我正在循環雖然節點一旦我得到一個爲什麼我不能對它執行操作呢?這是我不瞭解的部分。或者首先解決這個問題的正確方法。那麼當我找到一個匹配時,我必須刪除的所有子節點,然後重新創建的所有子節點?這在我的整體情況下不會有效。 – ScottEdge 2013-02-09 23:35:05

+0

你似乎錯過了鏈接的帖子顯示瞭如何獲得節點 – ikegami 2013-02-09 23:38:18

回答

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 2013-02-09 23:41:06

+0

你已經採取了12行代碼,並將其轉換爲6. – ScottEdge 2013-02-09 23:43:08

+0

XML :: LibXML不記錄XPath。我真的叫那2或3行。 – ikegami 2013-02-09 23:43:09