ディレクトリに多くのXMLファイルがあり、並べ替えて1つのファイルにマージする必要があります。ファイルの形式は次のとおりです。
File1.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypea>
<header someattr="1">
<docnumber>111</docnumber>
</header>
</doctypea>
File2.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypea>
<header someattr="1">
<docnumber>112</docnumber>
</header>
</doctypea>
File3.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypeb>
<header someattr="1">
<docnumber>111</docnumber>
</header>
</doctypeb>
File4.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypeb>
<header someattr="1">
<docnumber>112</docnumber>
</header>
</doctypeb>
このディレクトリ内のすべてのファイルは、次の基準で並べ替える必要があります。
- 書類番号
- doctype(aまたはb)
次に、それらをマージする必要があるため、出力ファイルは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<doctypea>
<header someattr="1">
<docnumber>111</docnumber>
</header>
</doctypea>
<doctypeb>
<header someattr="1">
<docnumber>111</docnumber>
</header>
</doctypeb>
<doctypea>
<header someattr="1">
<docnumber>112</docnumber>
</header>
</doctypea>
<doctypeb>
<header someattr="1">
<docnumber>112</docnumber>
</header>
</doctypeb>
これを実現するために、PerlでXML:Twigを使用しようとしています。私はこれまでに次のコードを持っています:
use XML::Twig;
my $xmldir = "/xmlfiles";
my $parser = XML::Twig->new(pretty_print => 'indented');
opendir(DIR, "$xmldir");
my @FILES= readdir(DIR);
closedir(DIR);
foreach (@FILES) {
if ($_ ne "." && $_ ne "..") {
print "reading file: $xmldir/$_\n";
$parser->parsefile("$xmldir/$_");
}
}
この時点では、パーサーから必要な要素を取得するための正しい構文を理解できないようです。
1.ルート要素("doctypea"または"doctypeb")の値を取得するにはどうすればよいですか?
2. docnumberフィールドまでノードを解析するために(1)それが必要だと思いますか?
私の計画は、ソートするためにdoctype%numberを使用してある種のhasを構築することですが、それらをそれとマージする最も簡単な方法はわかりません。
アドバイスに感謝します!