【发布时间】:2011-12-21 13:34:39
【问题描述】:
我在一个目录中有许多 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>
File4.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) 才能将节点解析到 docnumber 字段?
然后我的计划是构建某种带有 doctype%number 的 has 以进行排序,我不确定将它们与它合并的最简单方法。
感谢任何建议!
【问题讨论】:
-
这些不是 XML 文件。它们被 XML-Twig 和任何其他 XML 处理器拒绝,这是理所当然的。属性值必须加引号,并且每个根元素的开始和结束标记的名称必须匹配。
-
抱歉,我手动模拟了一个更简单的示例,使它们无效。它们是有效的 XML 文件。我更正了这个例子。