我需要一个Perl脚本来执行以下过程:
请参阅以下XML代码:
<booklist>
<book>
<author>Book 1 author 1</author>
<author>Book 1 author 2</author>
<title>Book 1 title</title>
<isbn>Book1ISBN</isbn>
</book>
<book>
<author>Book 2 author 1</author>
<author>Book 2 author 2</author>
<title>Book 2 title</title>
<isbn>Book2ISBN</isbn>
</book>
<book>
<author>Book 3 author 1</author>
<author>Book 3 author 2</author>
<author>Book 3 author 3</author>
<title>Book 3 title</title>
<isbn>Book3ISBN</isbn>
</book>
</booklist>
我如何提取部分
<book>
<author>Book 3 author 1</author>
<author>Book 3 author 2</author>
<author>Book 3 author 3</author>
<title>Book 3 title</title>
<isbn>Book3ISBN</isbn>
</book>
并使用Perl移动到单独的XML文件?
答案 0 :(得分:2)
您可以像这样使用XML :: Twig:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $t= XML::Twig->new( twig_roots => { book => \&book },
pretty_print => 'indented',
)
->parsefile( 'books.xml');
sub book
{ my( $t, $book)= @_;
my $isbn= $book->field( 'isbn');
if( $isbn eq 'Book3ISBN')
{ $book->cut->print_to_file( "$isbn.xml"); }
else
{ $t->flush; }
}
这假设您选择要根据其ISBN提取的图书,并且您要输出没有该图书的初始文件。
如果标准是其他标准,则在book
中调整测试。
如果您不想触摸原始文件,请移除对cut
的呼叫,并将flush
替换为purge
(这些方法会丢弃树中的先前元素所以你不要使用太多内存,如果初始文件很小,那么你就不需要它们了)