为什么 XML::LibXML 将子项添加到一个<book>而不是另一个?



我发现XML::LibXML有一些奇怪的行为。

下面的代码旨在将<year>2005</year>添加到两个<book>节点。有什么问题吗?我已经尝试更改XPath查询(//library/book),但结果是相同的。

use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->new->parse_string( << 'MAIN' );
  <library>
    <book>
      <title>Perl Best Practices</title>
      <author>Damian Conway</author>
      <isbn>0596001738</isbn>
      <pages>542</pages>
      <image src="http://www.oreilly.com/catalog/covers/perlbp.s.gif"
             width="145" height="190" />
    </book>
    <book>
      <title>Perl Cookbook, Second Edition</title>
      <author>Tom Christiansen</author>
      <author>Nathan Torkington</author>
      <isbn>0596003137</isbn>
      <pages>964</pages>
      <image src="http://www.oreilly.com/catalog/covers/perlckbk2.s.gif"
             width="145" height="190" />
    </book>
  </library>
MAIN
my ( $age ) = XML::LibXML->new
                ->parse_string( '<year>2005</year>' )
                  ->findnodes( './year' );
my @books = $xml->findnodes( '//book' );
$_->addChild( $age ) for @books;
print $xml->toString;

输出
<?xml version="1.0"?>
<library>
    <book>
      <title>Perl Best Practices</title>
      <author>Damian Conway</author>
      <isbn>0596001738</isbn>
      <pages>542</pages>
      <image src="http://www.oreilly.com/catalog/covers/perlbp.s.gif" width="145" height="190"/>
    </book>
    <book>
      <title>Perl Cookbook, Second Edition</title>
      <author>Tom Christiansen</author>
      <author>Nathan Torkington</author>
      <isbn>0596003137</isbn>
      <pages>964</pages>
      <image src="http://www.oreilly.com/catalog/covers/perlckbk2.s.gif" width="145" height="190"/>
    <year>2005</year></book>
  </library>

添加节点将在该节点和被添加节点之间创建父子关系。

一个节点不能有两个父节点,所以当您将year节点添加到第二本书时,它将从第一本书中删除。您需要为每本书创建一个节点。

for my $book ($xml->findnodes('//book')) {
   my $year = XML::LibXML::Element->new('year');
   $year->appendTextNode('2005');
   $book->addChild($year);
}

my $year = XML::LibXML::Element->new('year');
$year->appendTextNode('2005');
for my $book ($xml->findnodes('//book')) {
   $book->addChild( $year->cloneNode(1) );
}

相关内容

  • 没有找到相关文章

最新更新