У меня есть таблица в MySQL, которая имеет одно поле, определенное как TEXT. Информация подается в базу данных с помощью веб-формы, используя текстовое поле.
Я использую следующий script для создания XML с информацией из таблицы:
#!/usr/bin/perl
use strict;
use DBI;
use XML::Generator::DBI;
use XML::Handler::YAWriter;
my $dbh = DBI->connect ("DBI:access info goes here",
{ RaiseError => 1, PrintError => 0});
my $out = XML::Handler::YAWriter->new (AsFile => "-", Encoding=>"ISO-8859-1");
my $gen = XML::Generator::DBI->new (
Handler => $out,
dbh => $dbh
);
$gen->execute ("SELECT text FROM table");
$dbh->disconnect ();
Проблема заключается в том, что когда введенный текст имеет разрывы, он генерирует неверный XML:
<text {http://axkit.org/NS/xml-generator-dbi}encoding="HASH(0x9c43ba0)">PHA+YWlqZHNvaWFqZG9pYXNqZG9pYXNqb2RpanNhaW9kanNhb2lkYXNvaWo8L3A+DQo8cD5zPC9w
Pg0KPHA+ZDwvcD4NCjxwPmFzPC9wPg0KPHA+ZHNhPC9wPg0KPHA+ZDwvcD4NCjxwPnNhZHNhZHNh
ZHM8L3A+DQo8cD4mbmJzcDs8L3A+DQo8cD5hc2Rhc2Rzc2FkZHNkc2FzZHNhPC9wPg0KPHA+Jm5i
c3A7PC9wPg0KPHA+YXNkZHNhZHNhYXNkc2Rhc2RhYXNkPC9wPg==
</text>
Например, если введенный текст:
<p>One</p>
<p>Two</p>
Он выводит неверный XML, но когда текст:
<p>One</p> <p>Two</p>
Он правильно печатает XML.
Есть ли способ "вырезать" брешь из текстового поля или игнорировать его при создании XML?
Спасибо.
Это может сработать для обеспечения корректности:
$text = s|(?i)(<br)>|$1 />|gm;
который превратит любой пустой тег linebreak в пустой тег, совместимый с корректной XML-формой.
С моим беглым взглядом на классы, которые вы используете, похоже, если вы можете войти в цепочку обработчиков и обработать, скажем characters
, вы можете сделать что-то подобное перед вызовом XML::Generator::DBI->execute
.
$gen->set_content_handler(
SAXHandlerWrapper->new(
characters => sub {
s|(?i)(<br)>|$1 />|gm;
return $out->characters( $_ )
}
)
);
Если следующее поведение определяет SAXHandlerWrapper:
package SAXHandlerWrapper;
use 5.010;
use strict;
use warnings;
use Carp qw<croak>;
use Params::Util qw<_CODE _HASH _IDENTIFIER _INSTANCE>;
use Scalar::Util qw<blessed>;
sub _make_handler {
my $name = shift || $_;
return if __PACKAGE__->can( $name );
no strict;
*$name = sub {
my $action = shift->{ $name };
local $_ = $_[0];
return &$action;
}
}
sub new {
my $self = bless {}, shift;
my $current_name;
@_ = %{ shift() } if &_HASH( $_[0] );
while ( local $_ = shift @_ ) {
given ( $_ ) {
when ( !_IDENTIFIER( $_ )) {
croak( "Invalid parameter name: $_!" );
}
when ( 'event' ) {
croak( "Invalid event name: $_!" )
unless $current_name = _IDENTIFIER( shift )
;
_make_handler( $current_name );
}
when ( 'action' ) {
croak( 'Action not code reference!' )
unless my $action = _CODE( shift )
;
croak( 'No active handler name!' ) unless $current_name;
$self->{ $current_name } = $action;
}
default {
croak( "Invalid event: $_!" )
unless $self->{ $_ } = _CODE( shift )
;
_make_handler( $_ );
}
}
}
Carp::croak( 'Nothing handled!' ) unless %$self;
foreach ( grep { !_CODE( $self->{$_} ) } keys %$self ) {
Carp::croak( "Handler for $_ is not complete!" );
}
return $self;
}