使用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但在某种程度上格式不正确,那么程序应该终止而不是退回。)
答案 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::XML的is_xml
,is_well_formed_xml
方法并根据这些方法创建条件。