在PerlIF语句中标识XML声明



我正试图将样式表声明添加到脚本处理的任何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语句失败了,我可能在那里做了一些错误的事情。

有什么建议吗?

您有一个非常严格的正则表达式来查找XML标头。如果有多余的空间怎么办?如果编码或xml版本不同怎么办?Regex不是解析XML/HTML的合适工具(请参阅此答案),但是,可以理解您为什么要使用Regx,特别是考虑到您尝试做的事情的范围有限

话虽如此,如果你追求简单,并且愿意接受一些可能的失败,我会选择更简单的正则表达式,并且只做一次替换:

my $replaced = 0;
if ($inputline =~ m/<?xmlb.*>/ && !$replaced) {
    print OUTPUT $inputline;
    print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."n";
    $replaced = 1;
}

或者,您可以退出解析循环,假设这就是您在循环中所做的全部工作。

注意事项:

  • 如果您的XML都写在一行上,或者即使在同一行上有另一个标记(这是合法的),这很可能会破坏您的XML

编辑:

您的整个while循环可能如下所示:

while($inputline = <MYXML>) {
    my $replaced = 0;
    if ($inputline =~ m/<?xmlb.*>/ && !$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/<?xmlb.*>/ && !$replaced) {
        print OUTPUT '<?xml-stylesheet type="text/xsl" href="askaway_transcript_stylesheet.xsl"?>'."n";
        $replaced = 1;
    }
}

最新更新