如何使用perl将xml字符串放在html表格单元格中

时间:2014-01-22 12:49:42

标签: html xml perl

我在变量中有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 
______|________ 

2 个答案:

答案 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>";