2

我最近的任务是创建一个脚本解决方案,以从在线 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)。

我已经做了一些在线查找,似乎有很多更复杂的方法可以做到这一点,理想情况下,我会感谢任何关于如何做到这一点的指导。

这是我第一次尝试这样的事情,并且有一个考虑到这一点的最后期限。因此,理想情况下,如果有人能提出任何建议、提示或额外阅读,我将不胜感激。这是我最初的研究阶段,所以到目前为止我还没有开始尝试组合一个解决方案。

如果我遗漏了任何您想知道的更好的建议,请询问,我会尽快发布答案。

感谢您查看并给出任何建议。

**想知道为什么在没有任何评论的情况下将其标记为下降?

4

2 回答 2

1

您可以使用XML::Twig的一部分xml_split来执行此操作。如果该工具不能执行您想要的操作,您可以使用 XML::Twig 本身按照您想要的方式分解原始文件。该模块旨在处理大文件。

另一个 Perl 解决方案是使用XML::LibXML,尤其是XML::LibXML::Reader中的阅读器接口。

于 2014-01-09T15:04:57.150 回答
0

对于大文件,推荐流式解析。现在你只对一些标签感兴趣,而且文件很大(不适合内存)。

这里有一些阅读: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";
  }
于 2014-01-13T12:35:16.407 回答