1

xml 要素のコンテンツを更新しようとしています。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>
4

1 に答える 1

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');
}
于 2013-02-09T23:36:53.430 に答える