2016-09-14 11 views
2

什么是检测XML最佩尔利方式(使用XML ::的libxml/libxml2的)或纯文本输入用Perl(5.18或更高版本)?自动检测XML或纯文本输入与文件和标准输入用Perl

我有一个程序,可以接受纯文本输入或XML输入和XML输入可以是任意编码。输入来自文件(ARGV)或STDIN。当只有纯文本被认为是,下面的代码就足够了:

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

这将让整个输入文件或标准输入文本,使用默认的编码设置。

当只有XML考虑,下面的代码是可用的(对于文件):

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

但是,什么是将两者结合起来的最佳方式?我希望libxml2在输入中首先进行破解,如果失败则返回纯文本。如果我直接传递IO => * STDIN,libxml2的将消耗的输入端,该程序将在后面需要的libxml2如果确定该输入不是XML。

(注意:如果libxml2的确定输入某种XML的,但在某些方面存在格式错误,那么程序应该改为终止回落的。)

+0

http://search.cpan.org/~fitzner/File-LibMagic-0.96/LibMagic.pm – xxfelixxx

+1

如何知道包含''的文件是XML文件还是纯文本文件?它可能是两个。 – nwellnhof

+0

nwellnhof,这是一个很好的观点。我的回答是,您设计的代码以这种或那种方式回答问题。特别是:''是一个XML文件,因为XML没有下手'':您可以直接进入的第一个元素。您也可以将字节顺序标记作为第一个字符。更一般的观点是,我想_libxml2采取第一裂纹在输入,然后回落到纯文本如果(libxml2的解析)fails_。根据一些测试,libxml2还会接受根元素前后的空白。 –

回答

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 ([email protected]){ 
    #file failed to validate, handle as text below 
} 

另外,您可以使用Text::XMLis_xmlis_well_formed_xml方法并基于这些创建条件。

+0

对不起,但实际上我没有找到。我不想验证XML;我期待确定输入是否为XML(以任何编码方式)。例如,它可以以<?xml version =“1.0”?>',或UTF-8 BOM 0xEF,0xBB,0xBF后跟或带或不带BOM的UTF-16BE甚至EBCDIC开头。我想从交付标准输入字节直接libxml2的,但这时如果libxml2的说,这是不是XML,以保持字节尝试处理流为纯文本。 –

相关问题