Каков наиболее простой способ обнаружения XML (с использованием XML :: LibXML/libxml2) или простого ввода текста с помощью Perl (5.18 или выше)?Автоматическое обнаружение ввода XML или обычного текста с файлом и STDIN с помощью Perl
У меня есть программа, которая может принимать текстовый ввод или вход 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 => * STDIN напрямую, libxml2 будет потреблять вход, который потребуется программе позже, если libxml2 определяет, что вход не является XML.
(Примечание: если libxml2 определяет, что вход какой-то XML, но неправильный формат в некотором роде, то программа должна прекратить вместо отступая.)
http://search.cpan.org/~fitzner/File-LibMagic-0.96/LibMagic.pm – xxfelixxx
Как узнать, содержит ли файл, содержащий ' ' - это XML-файл или текстовый файл? Это может быть и то, и другое. –
nwellnhof
nwellnhof, это хороший момент. Мой ответ заключается в том, что вы разрабатываете код для ответа на вопрос так или иначе. В частности: ' ' - это XML-файл, потому что XML не должен начинаться с ' Xml version =" 1.0 "?>': Вы можете перейти прямо в первый элемент. Вы также можете иметь знак байтового заказа в качестве первого символа. Более общий момент заключается в том, что я хотел бы, чтобы _libxml2 взял первую трещину на входе, затем вернется к простому тексту, если (разбор libxml2) failed_. На основе некоторых тестов libxml2 также принимает пробелы до и после корневого элемента. –