Почему XML :: LibXML продолжает печатать ошибки, даже когда я их отключаю? - PullRequest
4 голосов
/ 06 октября 2010

Я использую XML::LibXML для разбора документа.

Файл HTML, стоящий за ним, содержит некоторые незначительные ошибки, и анализатор сообщает о них:

http://is.gd/create.php?longurl=http://google.com:15: validity error : ID smallink already defined
nal URL was <a href="http://google.com">http://google.com</a><span id="smallink"
                                                                                ^
http://is.gd/create.php?longurl=http://google.com:15: validity error : ID smallink already defined
and use <a href="http://is.gd/fNqtL-">http://is.gd/fNqtL-</a><span id="smallink"
                                                                                ^

Однако яотключено создание отчетов об ошибках:

my $parser = XML::LibXML->new();
$parser->set_options({ recover           => 2,
                       validation        => 0,
                       suppress_errors   => 1,
                       suppress_warnings => 1,
                       pedantic_parser   => 0,
                       load_ext_dtd      => 0, });

my $doc = $parser->parse_html_file("http://is.gd/create.php?longurl=$url");

Мой единственный способ подавить эти ошибки - запустить скрипт с 2>/dev/null, что мне не нужно.Может ли кто-нибудь помочь мне, пожалуйста, избавиться от этих ошибок?

Ответы [ 2 ]

6 голосов
/ 06 октября 2010

Понятия не имею, правильно ли вы просите XML :: LibXML не печатать свои предупреждения. Я предполагаю, что это так, и это ошибка в XML :: LibXML (о которой вы также должны сообщить автору), и она содержит только способы подавления предупреждений.

Каждый раз, когда должно быть напечатано предупреждение, perl ищет значение $SIG{__WARN__} и, если оно содержит ссылку на код, вызывает его вместо печати самого предупреждения.

Вы можете использовать эту функцию, чтобы предупреждения, которые вы хотите игнорировать, были напечатаны на STDERR. Тем не менее, вы должны быть осторожны с этим. Обязательно подавляйте только ложные срабатывания, а не все предупреждения. Предупреждения обычно полезны. Кроме того, убедитесь, что вы используете $SIG{__WARN__} в минимально возможном объеме, чтобы избежать побочных эффектов.

# warnings happen just as always
my $parser = ...;
$parser->set_options(...);

{ # in this scope we filter some warnings
    local $SIG{__WARN__} = sub {
        my ($warning) = @_;
        print STDERR $warning if $warning !~ /validity error/;
    };

    $parser->parse_html_file(...);
}

# more code, now the warnings are back to normal again

Также обратите внимание, что все это при условии, что эти предупреждения приходят из perl-space. Вполне возможно, что libxml2, библиотека C, которую использует XML :: LibXML, записывает предупреждения непосредственно в stderr. $SIG{__WARN__} не сможет помешать этому.

2 голосов
/ 06 октября 2010

Возможное решение - установить обработчик $SIG{__WARN__}, который фильтрует сообщения или просто отключает все предупреждения:

local $SIG{__WARN__} = sub { /* $_[0] is the message */ };
...