我在一个目录中有许多 XML 文件需要排序并合并到一个文件中。文件格式如下:
文件1.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypea>
<header someattr="1">
<docnumber>111</docnumber>
</header>
</doctypea>
文件2.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypea>
<header someattr="1">
<docnumber>112</docnumber>
</header>
</doctypea>
文件 3.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypeb>
<header someattr="1">
<docnumber>111</docnumber>
</header>
</doctypeb>
文件 4.xml:
<?xml version="1.0" encoding="utf-8"?>
<doctypeb>
<header someattr="1">
<docnumber>112</docnumber>
</header>
</doctypeb>
此目录中的所有文件都需要按照以下标准进行排序:
- 文件号码
- 文档类型(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. 我假设我需要 (1) 才能将 parsenode 解析到 docnumber 字段?
然后我的计划是构建某种带有 doctype%number 的 has 以进行排序,我不确定将它们与它合并的最简单方法。
感谢任何建议!