Скриптовое решение для создания ресурса записи данных из XML
Недавно я получил задание по созданию сценариев для создания записей ресурсов Data Capture из онлайн-канала XML.
Это не то, что я делал раньше, и был бы признателен, если бы кто-нибудь мог предложить какие-то ключевые моменты, о которых я должен знать, любое предварительное чтение, на которое я мог бы взглянуть, или любые другие вопросы или "подводные камни", которые я должен принять во внимание. рассмотрение при этом. Терминология, которая может быть специфичной для этого типа задач, также будет большой помощью.
В идеале я хотел бы добиться этого с помощью JQuery, или, если было бы проще выполнить задачу, использовать Perl. Мои знания JQuery лучше, чем мои знания Perl.
Моя цель - взять из Интернета очень большой XML-канал, состоящий из нескольких узловых элементов, состоящих из разнообразного контента. Пример XML ниже.
<response>
<result name="response" numFound="3559" start="0">
<doc>
<str name="PID">islandora:4466</str>
<arr name="dc.coverage">
<str>4466</str>
</arr>
<arr name="dc.description">
<str>
Text
</str>
<str>
<p><iframe src="http:" width="230" height="230" frameborder="0" allowtransparency="65535" scrolling="auto"></iframe></p>
<p><a href="/assets/.....">Transcript (DOC, 150KB) </a></p>
</str>
</arr>
<arr name="dc.identifier">
<str>islandora:4466</str>
</arr>
<arr name="dc.subject">
<str>heav422</str>
<str>heav533</str>
<str>heav547</str>
<str>heav549</str>
<str>discipline1137</str>
<str>theme778</str>
</arr>
<str name="dc.title">Text</str>
<arr name="hea.abstract">
<str> <!-- HTML ready content (example below) -->
<p>Text</p>
<ul>
<li>Text</li>
<li>Text</li>
<li>Text</li>
<li>Text</li>
<li>Text</li>
<li>Text</li>
<li>Text</li>
</ul>
<p>Text</p>
</str>
</arr>
<arr name="hea.date">
<str>2012-05-01 00:00:00</str>
</arr>
<arr name="hea.discipline">
<str>1137</str>
</arr>
<arr name="hea.heav">
<str>422</str>
<str>533</str>
<str>547</str>
<str>549</str>
</arr>
<str name="hea.resource_type">808</str>
<arr name="hea.theme">
<str>778</str>
</arr>
<arr name="hea.title">
<str>Text</str>
</arr>
<date name="timestamp">2013-11-07T08:12:22.684Z</date>
</doc>
</result>
</response>
В идеале я хотел бы разработать что-то, что позволило бы разбить исходный большой XML на отдельные XML-файлы для использования в качестве записей для сбора данных.
Сначала я подумал о том, что я мог бы использовать JQuery $.parseXML, чтобы разделить исходный XML на отдельные записи, а затем сохранить каждый как отдельный файл.XML, прежде чем поместить их в мою рабочую CMS и преобразовать их в DCR (используя функциональные возможности CMS).
Я немного посмотрел в Интернете, и, кажется, есть много более сложных способов сделать это, и в идеале я был бы признателен за любые рекомендации относительно того, как это сделать.
Я впервые попробую что-то подобное, и у меня будет крайний срок, который учитывает это. Так что в идеале, если кто-то может предложить какие-либо, советы или дополнительные советы, я был бы признателен Это моя начальная стадия исследования, так что пока я не начал пытаться найти решение.
Если я пропустил что-то, что вы хотели бы узнать, чтобы лучше посоветовать, пожалуйста, спросите, и я постараюсь опубликовать ответ как можно скорее.
Спасибо за взгляд и любые советы, которые даны.
** Интересно узнать, почему это было отмечено без каких-либо комментариев, почему?
Дэн
2 ответа
Вы можете использовать xml_split, который является частью XML::Twig, чтобы сделать это. Если инструмент не делает то, что вы хотите, вы можете использовать сам XML::Twig, чтобы разбить исходный файл так, как вы хотите. Модуль предназначен для обработки больших файлов.
Другим решением Perl является использование XML:: LibXML, особенно интерфейса считывателя в XML:: LibXML:: Reader.
Для больших файлов рекомендуется потоковый анализ. Сейчас вас интересуют только некоторые теги, и размер файла огромен (не помещается в память).
Вот некоторые чтения: http://coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/55
Модуль CPAN: http://metacpan.org/pod/XML::Twig
Пример:
use XML::Twig;
use Data::Dumper;
my $xml=<<ENDOFXML;
... your xml here ...
ENDOFXML
my $index = 0;
my $t= XML::Twig->new(
twig_roots => { 'doc' => 1},
no_prolog => 0,
twig_handlers =>
{ doc => \&print_n_purge,
},
pretty_print => 'indented',
);
$t->parse($xml);
sub print_n_purge
{ my( $t, $elt)= @_;
$index++;
my $filename = "out-$index.xml";
open(my $fh,'>',$filename) or die $!;
$t->flush($fh);
close($fh);
print "created $filename\n";
}