我在变量中有xml消息,想要使用表格在浏览器上显示。我在下面尝试过,但在渲染到浏览器时,实际的xml字符串没有显示。
open FH, ">report.html";
my $x=qq(<?xml version="1.0" encoding="utf-8" ?>
<Soap-ENV:Envelope xmlns:Soap-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:msdwHdr="http://xml.xdft.com/ns/appmw/soap/1.0/header" version="1.1">
<Soap-ENV:Body>
<CheckTrade>
<tradeId>492195</tradeId>
</CheckTrade>
</Soap-ENV:Body>
</Soap-ENV:Envelope>);
print FH "<table><tr><td>test</td><td>$x</td></tr></table>";
如果我运行上面的代码并在浏览器中打开report.html我能够看到第一个TD值,而在第二个TD中它只显示492195(这是tradeid的一部分)我希望看到完整的$ x值。我查看了html的来源。它显示的是与$ x相同但在浏览器上它不是。
______________
test | 492195
______|________
答案 0 :(得分:2)
您遇到的问题是XML文档在HTML中不能很好地发挥作用。所有<>
字符都会混淆您的浏览器,因此您只获得tradeID的值。在将XML字符串放入HTML文档之前,请查看this answer以了解如何对其进行编码。
答案 1 :(得分:2)
您还可以通过将整个XML字符串放在[CDATA][1]
部分中来转义它:
print FH "<table><tr><td>test</td><td><![CDATA[$x]]></td></tr></table>";
当然,只有SOAP消息本身不包含CDATA,这才有效。如果发生这种情况,您需要将其分解:在]]>
的SOAP消息中替换CDATA结束标记]]]><![CDATA[]>
(关闭标记中间的CDATA部分并开始新的标记) ,从标记结束开始:
$x=~ s{]]>}{]]]><![CDATA[]>}g;
或更清楚:
$x=~ s{]]>} # CDATA end marker
{] # beginning of the end marker
]]> # end the first CDATA section
<![CDATA[ # start a new CDATA section
]>}gx; # end of the end marker
关于Perl风格的几点说明:
目前的最佳做法是避免使用词汇文件句柄,
使用3 args形式的open也被认为更好,在您的情况下可能使用编码:
所以写这个可能更好:
open( my $fh, '>:utf8', 'report.html') or die "cannot open reports.html: $!";
...
print {$fh} "<table><tr><td>test</td><td><![CDATA[$x]]></td></tr></table>";