通过Perl编码将Postgres数据库中的数据提取为XML

通过Perl编码将Postgres数据库中的数据提取为XML,xml,perl,postgresql,encoding,character-encoding,Xml,Perl,Postgresql,Encoding,Character Encoding,我有一个用UTF-8编码的Postgres数据库。我将Perl与以下模块一起使用: use DBI use XML::Generator::DBI use XML::SAX::Writer 要使用查询将Postgres数据库中的数据提取到XML文件,例如: use DBI; use XML::Generator::DBI; use XML::SAX::Writer; my $dbh = DBI->connect("dbi:Pg:dbname=postgres;host=MYHOST;p

我有一个用UTF-8编码的Postgres数据库。我将Perl与以下模块一起使用:

use DBI
use XML::Generator::DBI
use XML::SAX::Writer
要使用查询将Postgres数据库中的数据提取到XML文件,例如:

use DBI;
use XML::Generator::DBI;
use XML::SAX::Writer;

my $dbh = DBI->connect("dbi:Pg:dbname=postgres;host=MYHOST;port=2278",
                      username,
                      password,
                      {RaiseError => 1},
                     );

my $handler = XML::SAX::Writer->new( Output => 'foo.xml' );

my $generator = XML::Generator::DBI->new(
 Handler => $handler,
 dbh     => $dbh,
 Indent  => 1,
);

$select = qq(

!!!!SQL QUERY!!!!!

);

$generator->execute(
                     $select, 
                     undef,
                     RootElement => 'root',
                        );
这很有效,因此我得到了一个有效的XML文档。我的问题是数据库中的一些数据是二进制的,即其中有非UTF-8字符。发生这种情况时,XML::Generator::DBI会检测到这种情况,并按如下方式在XML文件中输出数据:

<foo dbi:encoding='base64'>VGhpcyByZXBvcnQgbGlzdHMgYWxsIGZpbGVzIGhhdmluZyBhY2Nlc3NlcyB0byBkYXRhYmFzZSB0
YWJsZXMuDQpJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiAgRmlsZSBmdWxs
IG5hbWUsIGFjY2Vzc2VkIHRhYmxl
</foo>
VGhpcyByZXBvcnQgbGlzdHMgYWxsIGZpbGVzIGhhdmluZyBhY2Nlc3NlcyB0byBkYXRhYmFzZSB0
YWJsZXMuDQpJdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiAgRmlsZSBmdWxs
IG5HBWUSIGFJY2VZC2VKIHRXL
名称空间也绑定到URL。根据模块文档,这是正确的行为,但我想知道的是:是否有可能以某种方式将此base64编码字符串转换为UTF-8,以便我可以实际使用它


我根本不是Perl专家,也不是这方面的博士后,所以放轻松!非常感谢。

我想你可以用。。。但这取决于数据是什么。如果中有非UTF-8字符,它们是什么?您需要知道从何处进行转换。

如果“二进制”表示PostgreSQL中的列类型为
bytea
,那么您可以:

  • $dbh
    上设置
    bytea\u output=escape
    ,如下所示:

    $dbh->do('SET bytea_output=escape')

  • 将查询中类型为
    bytea
    的列强制转换为
    text

    SELECT bytea\u column::text FROM…


  • 我怀疑这两个都不是你想要的结果。希望这会让你走上正确的方向。

    谢谢你的回复。不知道该模块-谢谢(不知道如何整合该模块,但会研究)。作为Base64的数据通常是代码示例,例如,java、C++编码的存储在表中的样本,但不一定如此。对于我问题中的示例,这可以转换为:此报告列出了所有可以访问数据库表的文件。它提供了以下信息:文件全名,访问的表”-所以我猜它一定是:导致base64输出的原因?只是扩展了数据的实际内容。我在问题中提供的示例实际上存储在Postgres数据库中:“此报告列出了访问数据库表的所有文件。它提供以下信息:文件全名,访问的表“即,我认为在第一次全站后有回车符。在本例中,这一定是使用base64的原因”:“是UTF-8允许的字符,不应导致使用base64…进一步。。。我查找了创建此数据的脚本。下面是它包含的内容:此报告列出了可以访问数据库表的所有文件。
    !xD!``!xA它提供了以下信息:文件全名,访问表OK,我不知道为什么要将其转换为Base64。回车符在UTF-8中是完全有效的字符。您确定XML::Generator::DBI是最好的模块吗?如何使用普通的DBI和普通的XML::生成器,自己在中间做一点?我没有太多时间来讨论这个问题,但如果您对这个速度感到满意,请继续评论,当我有了更清楚的想法时,我会更新答案;-)