Как извлечь часть кода XML из файла XML с помощью Perl Script и перенести в отдельные файлы - PullRequest
0 голосов
/ 22 февраля 2011

Мне нужен Perl Script для выполнения следующего процесса:

См. Следующий код 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>

и переместить в отдельный файл XML с помощью Perl?

1 Ответ

2 голосов
/ 22 февраля 2011

Вы можете использовать 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 (эти методы отбрасывают предыдущие элементы в дереве, поэтому вы не используете слишком много памяти, если исходный файл мал, значит он вам не нужен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...