XMLファイルを複数のファイルに分割

XMLファイルを複数のファイルに分割

別のノードを含むxmlファイルがありますが、次のようにファイルを分割したいと思います。

<unix>
 <mm>
</unix>
<osx>
 <nn>
</osx>

unix.xmlスクリプトを実行すると、次の内容で呼び出されるxmlファイルを生成したいと思います。

<unix
 <mm>
</unix>

osx.xml次に、次の内容で呼び出される別のxmlファイルがあります。

<osx>
 <nn>
</osx>

答え1

まず、XML解析にXMLパーサ以外のものを使用することは非常に悪い考えだと思います。正規表現可能バラよりうまくいくようですが、壊れやすいコードを書くのは本当に良い方法です。意味上、同じXMLは、異なるRE(たとえば、インデント/改行、単項タグ)によって異なるように見えることがあります。

だからそれを念頭に置いて、私はPerlとXML::Twigライブラリを使用します。これは非常に標準的なものです。事前にビルドされたパッケージはどこにでもあります。

しかし、おそらく最も重要なことは、あなたが投稿したXMLが無効であるということです。私はこれが実際のXMLではなくサンプルなので、何かが欠けていると仮定します。私はサンプルとして使用しています:

<root>
<unix>
 <mm />
</unix>
<osx>
 <nn />
</osx>
</root>

このコードを使用すると、要件が満たされます。

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->parsefile("your_xml.xml");

foreach my $element ( $twig->root->children ) {
    my $tag = $element->tag;
    print "Processing $tag\n";

    #print to STDOUT for debugging
    print $element ->sprint;

    #print to output file
    open( my $output, ">", "$tag.xml" ) or warn $!;
    print {$output} $element->sprint;
    close($output);
}

もちろん、公開されたXML文字通りもしあなたが持っているものがあればそれはXMLが破損しているので、理想的にはそれを与えた人に行き、仕様書のロールアップコピーを提供する必要があります。実際の生活でこれが実用的でない場合は、Stack Overflowで次のような答えを提供します。 https://stackoverflow.com/a/28913945/2566198

答え2

私は次のことが役に立つと思います。これは一般的な作業であり、2つの制限の間で行う必要があります。

unset f t
while read l
do
  t=${t:+$t\\n}$l
  l=${l//[<>]/}
  : ${f:="$l"}
  if [ "$l" = "/$f" ]
  then
    echo -e "$t" > "$f".xml 
    unset f t
  fi
done < <(cat your_xml_file)

答え3

XMLカット~からxml-coreutilsあなたのニーズを満たすことができます

関連情報