如何使用 setAttribute() 插入文字'&'



我使用的是XML::LibXML(2.0018;perl 5.16.3(我有一个哈希,它包含一系列属性,然后使用setAttribute()将这些属性应用于XML文档。这些内容用于更新tomcat server.xml文件,该文件需要修改才能与apachehttpd前端一起使用,并由连续部署脚本执行。

添加基本属性效果良好:

use XML::LibXML qw ();
...
my %tmphash = ( port => "8581", address => "127.0.0.1", ... );
...

然后在一些采用哈希引用的方法中:

foreach my $key (keys %$hashConnRef) {
$connector->setAttribute("$key" => $hasConnRef->{$key});
}

一切都很好,到目前为止,我需要在输出中添加一个需要文本&的属性,以便tomcat能够正确地获取它。

要放入的server.xml文件中的属性应该如下所示(所需结果(:

relaxedQueryChars="[]|{}^\`"<>" 

然而,setAttribute()调用方便地将"&"转换为"&",从而产生(电流输出(:

relaxedQueryChars="[]|{}^\`"<>"

我尝试过转义(和双重转义(散列中的条目,例如:

relaxedQueryChars => "[]|{}^\`"<>"

不幸的是,在前一种情况下,它只是放了\&#x60,而在后一种情况中,它在&之前添加了。我如何在散列中定义字符串,以便它通过setAttribute进行处理并正确地发出&#x5c

根据请求,这里有一个完整的例子:

/tmp/min.xml(基本上从tomcat conf/server.xml剥离的所有内容(:

<?xml version="1.0" encoding="utf-8"?>
<Server port="8385" shutdown="SHUTDOWN">
<Service name="Catalina">
</Service>
</Server>

还有一个最小的示例程序:

#!/usr/bin/perl -w
use strict;
use warnings;
use XML::LibXML qw ( );
my %tmphash = (
port => "8381",
address => "127.0.0.1",
relaxedQueryChars => "[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"
);
sub edit_server_xml {
my ($serverFile, $hashConnRef) = @_;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($serverFile);
for my $server ($doc->findnodes("/Server")) {
# delete all of the defined connectors
for my $service ($server->findnodes("Service")) {
for my $connector ($service->findnodes("Connector")) {
$service->removeChild($connector);
}
}
my $connector = $doc->createElement("Connector");
for my $service ($server->findnodes("Service")) {
foreach my $key (keys %$hashConnRef) {
$connector->setAttribute("$key" => $hashConnRef->{$key});
}
$service->appendChild($connector);
$service->appendTextNode("n");
}
$doc->toFile($serverFile);
}
}
edit_server_xml("/tmp/min.xml", %tmphash);

不正确的结果行:

<Connector address="127.0.0.1" relaxedQueryChars="[]|{}^&amp;#x5c;&amp;#x60;&amp;quot;&amp;lt;&amp;gt;" port="8381"/>

我认为基本上你唯一需要的改变是relaxedQueryChars => "[]|{}^\"<>"-不要预编码东西,libxml将负责所有必要的实体编码:

#!perl
use strict;
use warnings;
use XML::LibXML;
my $doc = XML::LibXML->load_xml(string=>'<f/>');
$doc->documentElement->setAttribute('foo' => '[]|{}<>\&#');
print $doc->toString
__END__
<?xml version="1.0"?> <f foo="[]|{}&lt;&gt;&amp;#"/>

维基百科不支持您担心XML中的反斜杠"转义下一个字符"——与字符&是用于对所有有问题的字符进行实体编码的字符。

相关内容

  • 没有找到相关文章

最新更新