我正在尝试将样式表声明添加到我的脚本处理的任何XML文件的第二行。我的脚本逐行将文件读入循环中的$ inputline字符串。
我有以下写得不好的Perl代码:
while(<INPUT>) {
$inputline = $_;
if ($inputline =~ m/\<\?xml\ version\=\"1\.0\"\ encoding\=\"UTF-8\"\?\>/){
print OUTPUT "\<\?xml version\=\"1.0\" encoding\=\"UTF-8\"\?\>\n";
print OUTPUT "\<\?xml\-stylesheet type\=\"text\/xsl\" href\=\"askaway_transcript_stylesheet\.xsl\"\?\>\n";
}
#lots of other processing stuff
}
而且我认为这种方法有效,但不再适用。测试不同的输出和调整事情告诉我IF语句失败了,我可能在那里做错了。
任何提示?
答案 0 :(得分:1)
您有一个非常严格的正则表达式来查找XML标头。如果有额外的空间怎么办?如果编码不同,或者xml版本怎么办?正则表达式不是解析XML / HTML的正确工具(请参阅this answer),但是为什么要使用正则表达式是可以理解的,特别是考虑到您尝试的范围有限。
话虽如此,如果你是为了简单,并且你愿意接受一些可能的失败,我会选择更简单的正则表达式并且只进行一次替换:
my $replaced = 0;
if ($inputline =~ m/\<\?xml\b.*\>/ && !$replaced) {
print OUTPUT $inputline;
print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."\n";
$replaced = 1;
}
或者,您可以退出解析循环,假设您正在循环中执行此操作。
警告:
编辑:
您的整个while
循环可能如下所示:
while($inputline = <MYXML>) {
my $replaced = 0;
if ($inputline =~ m/\<\?xml\b.*\>/ && !$replaced) {
print OUTPUT $inputline;
print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."\n";
$replaced = 1;
} else {
print OUTPUT $inputline;
}
}
或者:
while($inputline = <MYXML>) {
my $replaced = 0;
print OUTPUT $inputline;
if ($inputline =~ m/\<\?xml\b.*\>/ && !$replaced) {
print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."\n";
$replaced = 1;
}
}