首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Perl向eXist-db集合添加具有UTF-8字符的xml内容时出现的问题。

使用Perl向eXist-db集合添加具有UTF-8字符的xml内容时出现的问题。
EN

Stack Overflow用户
提问于 2015-04-28 21:35:10
回答 1查看 891关注 0票数 0

我试图使用Perl将动态生成的XML内容添加到eXist-db集合(请参阅下面的addFile.pl代码),问题是每当内容包含UTF-8字符时,我都会收到错误Failed to parse XML-RPC request: Byte "195" is not a member of the (7-bit) ASCII character set.

代码语言:javascript
复制
#!/usr/bin/perl
use RPC::XML;
use RPC::XML::Client;

my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my $timestamp = sprintf("%04d%02d%02d%02d%02d%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
print("Timestamp: $timestamp\n");

my $FILENAME = "$timestamp.xml";
my $COLLECTION = 'output';

my $record = <<END;
<document id="doc_20150419014112">
  <text>ñáéíóú</text>
</document>
END

$query = <<END;
xquery version "3.0";
import module namespace xmldb="http://exist-db.org/xquery/xmldb";
declare variable \$filename := '$FILENAME';
declare variable \$record := '';

let \$log-in := xmldb:login("/db", "admin", "admin")
(: let \$create-collection := xmldb:create-collection("/db", "$COLLECTION") :)
let \$record := 
$record

for \$target in ('/db/$COLLECTION')
  return xmldb:store(\$target, \$filename, \$record)
END

print $query;

$URL = "http://admin:admin\@localhost:8080/exist/xmlrpc";
# connecting to $URL...
$client = new RPC::XML::Client $URL;
# Output options
$options = RPC::XML::struct->new(
    'indent' => 'yes', 
    'encoding' => 'UTF-8',
    'highlight-matches' => 'none');
$req = RPC::XML::request->new("query", $query, 20, 1, $options);
$response = $client->send_request($req);
if($response->is_fault) {
    die "An error occurred: " . $response->string . "\n";
}
my $result = $response->value;
print $result;

当我使用eXide直接运行xquery脚本(参见下面)时,它正常运行,但是当我通过perl脚本运行它时,我会收到以下消息:

代码语言:javascript
复制
$ perl addFile.pl 

Timestamp: 20150428162016
xquery version "3.0";
import module namespace xmldb="http://exist-db.org/xquery/xmldb";
declare variable $filename := '20150428162016.xml';
declare variable $record := '';

let $log-in := xmldb:login("/db", "admin", "admin")
(: let $create-collection := xmldb:create-collection("/db", "output") :)
let $record := 
<document id="doc_20150419014112">
  <text>ñáéíóú</text>
</document>


for $target in ('/db/output')
  return xmldb:store($target, $filename, $record)
An error occurred: Failed to parse XML-RPC request: Byte "195" is not a member of the (7-bit) ASCII character set.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-29 19:15:38

我找到了解决方案这里,我将引用答案以防万一:

XML Perl模块默认使用us-ascii作为XML编码。如果从数据库或其他来源传递UTF-8内容,RPC::XML将生成带有默认设置的无效XML。

RPC::XML使用的XML编码只能在全局范围内更改:

代码语言:javascript
复制
#!/usr/bin/perl
use RPC::XML;
use RPC::XML::Client;
$RPC::XML::ENCODING = 'utf-8';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29930349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档