【问题标题】:Want to split an UNIX xml file based on tags想要根据标签拆分 UNIX xml 文件
【发布时间】:2015-09-26 14:23:30
【问题描述】:

我有一个包含如下批次的 XML 文件。

我想使用 shell 脚本根据标签将此文件拆分为 5 个文件。 请帮忙,提前谢谢。

<Items>
<Item>
<Title>Title 1</Title>
<DueDate>01-02-2008</DueDate>
</Item>
<Item>
<Title>Title 2</Title>
<DueDate>01-02-2009</DueDate>
</Item>
<Item>
<Title>Title 3</Title>
<DueDate>01-02-2010</DueDate>
</Item>
<Item>
<Title>Title 4</Title>
<DueDate>01-02-2011</DueDate>
</Item>
<Item>
<Title>Title 5</Title>
<DueDate>01-02-2012</DueDate>
</Item>
</Items>

期望的输出:

<Items>
<Item>
<Title>Title 1</Title>
<DueDate>01-02-2008</DueDate>
</Item>
</Items>

【问题讨论】:

  • 这与 UNIX 有什么关系? UNIX 是一种操作系统标准,而 XML 是一种文件格式...
  • 我正在尝试将单个单元从批处理中分离出来,并且我在 UNIX 操作系统中工作,所以我想知道如何使用 shell 脚本来实现。
  • @drewr2012 想知道:只是好奇你想从完成这项工作中获得什么。

标签: xml unix xml-parsing


【解决方案1】:

我建议 - 安装 XML::Twig,其中包括相当方便的 xml_split 实用程序。这可能会满足您的需求。例如:

xml_split -c Item

但是,我要提供您想要完成的工作并不容易,因为您正在尝试切割并保留 XML 结构。您不能使用基于标准行/正则表达式的工具来做到这一点。

但是您可以使用解析器:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;

my @item_list;

sub cut_item {
    my ( $twig, $item ) = @_;
    my $thing = $item->cut;
    push( @item_list, $thing );

}

my $twig = XML::Twig->new(
    twig_handlers => { 'Item' => \&cut_item }
);
$twig->parse(<>);

my $itemcount = 1;

foreach my $element (@item_list) {
    my $newdoc = XML::Twig->new( 'pretty_print' => 'indented_a' );
    $newdoc->set_root( XML::Twig::Elt->new('Items') );

    $element->paste( $newdoc->root );
    $newdoc->print;
    open( my $output, ">", "items_" . $itemcount++ . ".xml" );
    print {$output} $newdoc->sprint;
    close($output);
}

这使用XML::Twig 库从您的XML 中提取每个Item 元素(通过STDIN 传输,或通过myscript.pl yourfilename)。

然后它会迭代它找到的所有文件,添加一个Items 标头,并将其打印到一个单独的文件中。如果你有一个更复杂的根,这种方法可能需要更多的摆弄,但如果你这样做,它是可以适应的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多