如何使用Perl脚本从xml文件中提取部分xml代码并移动到单独的文件

时间:2011-02-22 07:11:17

标签: xml perl

我需要一个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文件?

1 个答案:

答案 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(这些方法会丢弃树中的先前元素所以你不要使用太多内存,如果初始文件很小,那么你就不需要它们了)