別のノードを含む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あなたのニーズを満たすことができます