mysql - 通过 Perl 脚本将带有断线的 MySQL TEXT 字段转换为 XML 会返回格式错误的符号

标签 mysql xml perl

我在 MySQL 中有一个表,其中一个字段定义为 TEXT。该信息通过使用文本区域的网络表单输入数据库。

我使用以下脚本生成包含表信息的 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;

这会将任何裸露的换行标记转换为符合 XML 格式良好的空标记。

通过我粗略地查看您正在使用的类,看起来如果您可以进入处理程序链并处理,例如字符,您也许可以以前做类似的事情对 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;
}

关于mysql - 通过 Perl 脚本将带有断线的 MySQL TEXT 字段转换为 XML 会返回格式错误的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917216/

相关文章:

mysql - 我正在尝试替换 :search when the query is executed but it does not seem to be replaced

php - 电子邮件消息不显示 mysql 列

bash - 在多个文件中将每第 4 次出现的 char "_"替换为 "@"

mysql - SQL 连接 : Select rows with no match in second table

xml - 循环 XML 并返回元素值

Android:将一个 xml 包含到另一个 xml 中

java - 无法使用 JAXB 读取 XML 文件

perl - 当参数省略时如何让 sub 使用 $_ ?

Perl:从 <> 读取

mysql - SQL 提取用户组 ID,仅包含指定的用户 ID