使用Perl自动检测带文件和STDIN的XML或纯文本输入

时间:2016-09-14 02:19:40

标签: perl stdin libxml2

使用Perl(5.18或更高版本)检测XML(使用XML :: LibXML / libxml2)或纯文本输入的最Perly方法是什么?

我有一个程序可以接受纯文本输入或XML输入,XML输入可以是任意编码。输入来自文件(ARGV)或STDIN。仅考虑纯文本时,以下代码就足够了:

local $/ = undef;
my $text = <> || die;

这将使用默认编码设置将整个输入文件或STDIN作为文本。

当仅考虑XML时,以下代码可用(对于文件):

my $parser = XML::LibXML->new();
my $xml = $parser->load_xml(location => $ARGV[0]);

但结合两者的最佳方法是什么?我希望libxml2在输入处获取第一个破解,然后如果失败则回退到纯文本。如果我通过IO =&gt; *直接使用STDIN,libxml2将使用输入,如果libxml2确定输入不是XML,程序稍后将需要该输入。

(注意:如果libxml2确定输入是某种XML但在某种程度上格式不正确,那么程序应该终止而不是退回。)

1 个答案:

答案 0 :(得分:0)

use XML::LibXML;

my $schema_file = 'test.xsd';
my $document    = 'test.xml';

my $schema = XML::LibXML::Schema->new(location => $schema_file);

my $parser = XML::LibXML->new;
my $doc    = $parser->parse_file($document); #Or handle STDIN

eval { $schema->validate($doc) };
if ($@){
    #file failed to validate, handle as text below
}

或者,您可以使用Text::XMLis_xmlis_well_formed_xml方法并根据这些方法创建条件。