我最近的任务是创建一个脚本化解决方案,以便从在线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文件,然后将它们放入我的工作内容管理系统并将其转换为DCR(使用内容管理系统的功能)。
我已经做了一些网上查找,似乎有很多更复杂的方法来做到这一点,理想情况下,我将感谢任何关于如何做到这一点的指导。
这是我第一次尝试这样的事情,并且有一个考虑到这一点的最后期限。因此,理想情况下,如果任何人能提出任何建议,提示或额外阅读,我将不胜感激。这是我的初步研究阶段,所以到目前为止,我还没有开始尝试提出解决方案。
如果我遗漏了任何您想知道的更好的建议,请询问,我将努力尽快发布答案。
感谢您的关注和任何给出的建议。
**好奇地想知道为什么这会被标记下来,而没有任何关于原因的评论?
丹
发布于 2014-01-09 23:04:57
您可以使用XML::Twig的一部分xml_split来完成此操作。如果该工具不能完成您想要的操作,您可以使用XML::Twig本身来按您想要的方式分解原始文件。该模块旨在处理大文件。
另一种Perl解决方案是使用XML::LibXML,特别是XML::LibXML::Reader中的读取器接口。
发布于 2014-01-13 20:35:16
对于大文件,建议使用流样式解析。现在你只对一些标签感兴趣,而且文件很大(内存放不下)。
下面是一些读物: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";
}https://stackoverflow.com/questions/21018676
复制相似问题