Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl将具有UTF-8字符的xml内容添加到eXist db集合时出现的问题_Perl_Utf 8_Xquery_Xml Rpc_Exist Db - Fatal编程技术网

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

使用Perl将具有UTF-8字符的xml内容添加到eXist db集合时出现的问题,perl,utf-8,xquery,xml-rpc,exist-db,Perl,Utf 8,Xquery,Xml Rpc,Exist Db,我试图使用Perl将动态生成的XML内容添加到eXist db集合(请参阅下面的代码addFile.pl),问题是每当内容包含UTF-8字符时,我都会收到错误解析XML-RPC请求失败:字节“195”不是(7位)ASCII字符集的成员。 #!/usr/bin/perl use RPC::XML; use RPC::XML::Client; my ($sec, $min, $hour, $mday, $mon, $year) = localtime(); my $timestamp = spri

我试图使用Perl将动态生成的XML内容添加到eXist db集合(请参阅下面的代码
addFile.pl
),问题是每当内容包含UTF-8字符时,我都会收到错误
解析XML-RPC请求失败:字节“195”不是(7位)ASCII字符集的成员。

#!/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;
#/usr/bin/perl
使用RPC::XML;
使用RPC::XML::Client;
我的($sec、$min、$hour、$mday、$mon、$year)=localtime();
我的$timestamp=sprintf(“%04d%02d%02d%02d%02d%02d”、$year+1900、$mon+1、$mday、$hour、$min、$sec);
打印(“时间戳:$Timestamp\n”);
my$FILENAME=“$timestamp.xml”;
我的$COLLECTION='output';
我的$record='none');
$req=RPC::XML::request->new(“查询”、$query、20、1、$options);
$response=$client->send_请求($req);
如果($response->is\u fault){
die“出现错误:“.$response->string.\n”;
}
我的$result=$response->value;
打印$result;
当我直接使用eXide运行xquery脚本(见下文)时,它会正常运行,但当我通过perl脚本运行它时,我会收到以下信息:

$ 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.
$perl addFile.pl
时间戳:20150428162016
xquery版本“3.0”;
导入模块命名空间xmldb=”http://exist-db.org/xquery/xmldb";
声明变量$filename:=“20150428162016.xml”;
声明变量$record:='';
让$login:=xmldb:login(“/db”、“admin”、“admin”)
(:let$create collection:=xmldb:create collection(“/db”,“output”):)
让$record:=
ñáéíóú
对于('/db/output')中的$target
返回xmldb:store($target,$filename,$record)
发生错误:无法分析XML-RPC请求:字节“195”不是(7位)ASCII字符集的成员。
我找到了解决方案,我将引用答案以防万一:

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

RPC::XML使用的XML编码只能全局更改:

#!/usr/bin/perl
use RPC::XML;
use RPC::XML::Client;
$RPC::XML::ENCODING = 'utf-8';

首先,您需要在脚本中使用utf8,因为您直接在脚本中键入宽字符。这将确保嵌入的字符串
ñáèíóú
实际上是UTF-8编码的。此外,请停止使用间接对象表示法。例如,不使用
new RPC::XML::Client
,而是编写
RPC::XML::Client->new
等。Perl不是Java。我已经尝试过“使用utf8”,但它不起作用。在包含UTF-8字符串的源代码中使用
utf8
是一个必要条件,但还不够。还要确保确实以UTF-8编码保存了文件。同样,这是一个必要的条件,任何人都应该花时间进一步探讨这一点。很明显,出于某种原因,数据库希望您提供7位ASCII码。在我看来,这个问题似乎是在您还没来得及开口说话之前出现的。eXist对UTF-8数据非常满意。您的XML-RPC客户端是否知道您正在使用UTF-8,并且对它感到满意?我认为您的错误可能来自您正在使用的XML:RPC库,但它不存在。