【问题标题】:Converting MySQL TEXT field with breaklines to XML by Perl script returns a malformed notation通过 Perl 脚本将带有断线的 MySQL TEXT 字段转换为 XML 会返回格式错误的表示法
【发布时间】:2011-04-24 10:50:09
【问题描述】:

我在 MySQL 中有一个表,其中一个字段定义为 TEXT。信息通过使用 textarea 的 webform 馈送到数据库。

我正在使用以下脚本来生成包含表信息的 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 时忽略它?

谢谢。

【问题讨论】:

    标签: mysql xml perl


    【解决方案1】:

    强制格式正确可能会起作用:

    $text = s|(?i)(<br)>|$1 />|gm;
    

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

    我粗略地看了一下你正在使用的类,看起来如果你可以进入处理程序链并处理,比如characters,你可以在调用@987654323之前做这样的事情@。

    $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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 2019-06-28
      • 2015-08-02
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多