1

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

有小费吗?

4

1 回答 1

1

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

话虽如此,如果您为了简单起见,并且愿意接受一些可能的失败,我会选择更简单的正则表达式,并且只进行一次替换:

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;
}

或者,您可以退出解析循环,假设这就是您在循环中所做的一切。

警告:

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

编辑:

您的整个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;
    }
}
于 2013-08-08T18:51:23.577 回答