【发布时间】:2015-10-06 06:05:40
【问题描述】:
完全免责声明:我是 Perl 的新手,一周或更短的经验。在工作中,我目前的项目涉及一个过程,在该过程中,我们从各个机构获取表示课程目录的 XML 文件,并将它们连接到一个文件中。我有一个可以正常工作的 Perl 脚本 + 模块,可以做到这一点;但是,我希望通过检查合并的文件是否满足以下条件来添加一些额外的功能:
1) 每个班级列表都来自同一学期(包含在标签中)
2) 每个班级都来自同一年(这包含在标签中)
这是我当前在合并后运行的子程序(这意味着问题肯定在下面的代码中):
sub check_files {
my ($self, $file) = @_;
my $parser;
my $parsed;
my @semesters;
my @years;
my $answer = 0;
my $correct = 0;
$parser = XML::LibXML->new;
$parsed = $parser->parse_file($file);
@semesters = $parsed->getElementsByTagName("SEMESTER");
@years = $parsed->getElementsByTagName("YEAR");
foreach my $semester1 (@semesters) {
my $semester2 = $semesters[1];
if($semester1 ne $semester2) {
if($semester1 ne "<SEMESTER>Do not delete this row</SEMESTER>") {
print "Check semesters in data! $semester1 $semester2 \n\n";
$answer += 1;
}
} else {
print "Equal strings: $semester1 $semester2 \n\n";
$correct += 1;
}
}
foreach my $year1 (@years) {
my $year2 = $years[1];
if($year1 ne $year2) {
if($year1 ne "<YEAR>Do not delete this row</YEAR>") {
print "Check years in data! $year1 $year2 \n\n";
$answer += 1;
}
} else {
print "Equal strings: $year1 $year2 \n\n";
$correct += 1;
}
}
print "Errors: $answer Correct: $correct \n\n";
return $answer;
}
我根据元素 1 而不是 0 检查所有内容,因为连接的第一个文件是标题行(应该等于“不要删除此行”的内容)。因此,“不要删除”的东西应该总是元素 0。
我在控制台中收到很多“检查数据中的学期!2013 2013”行。事实上,我的 $correct 变量增加的唯一时间是当条件失败时标题行。这让我觉得字符串比较有点搞砸了;我能想到的唯一解释是指针问题和编码。但同样,我上周才开始使用 Perl,所以我真的不知道我在说什么。我知道我的代码也不优雅,对此我深表歉意。
感谢任何可以提供帮助的人,或者甚至阅读本文并决定不提供帮助的人。
【问题讨论】:
-
布局合理的代码;谢谢。这个
my $semester2 = $semesters[1]很可疑。您正在将@semesters的每个元素与其第二个元素进行比较。如果这确实是您的意图,那么该语句应该在for之前,或者更确切地说,您应该遍历@semesters和last if $i == 1的索引。此外,您不得将您的元素与示例再现进行比较。您的 XML 数据可能以非常不同的方式表示相同的数据。您能否提供您的 XML 数据的副本或示例?没有看到输入很难提供解决方案 -
如果您的数据太大而无法发布,请考虑将其上传到
pastebin之类的网站,或者在此处放置一些可以证明您描述的问题的内容 -
XML 格式如下:
<SECTION> ... <YEAR>Do not delete this row</YEAR> <SEMESTER>Do not delete this row</SEMESTER> ... </SECTION> <SECTION> ... <YEAR>2013</YEAR> <SEMESTER>F</SEMESTER> ... </SECTION>以此类推,每个 SECTION 代表一门课程。 XML 需要很长时间才能粘贴到 Pastebin 中,但如果这还不足以解决问题,我可以继续使用它。 -
事实证明,对于 Pastebin 来说,数据实际上太大了。不过,除了我在上面发布的数以千计的内容之外,它的内容并不多。
-
我应该补充一点,我检查第二个元素,因为那是“不要删除”行之后的元素。从理论上讲,它应该等于其他一切或不等于其他一切。
标签: xml string perl comparison