我有一个XML文件,我从网上提取并解析。 XML中的一个项目是具有HTML的“内容”值。我使用XML::Simple::XMLin来解析文件,如下所示:
$xml= eval { $data->XMLin($xmldata, forcearray => 1, suppressempty=> +'') };
当我使用Data::Dumper
转储哈希时,我发现SimpleXML
正在将HTML解析为哈希树:
'content' => { 'div' => [ { 'xmlns' => 'http://www.w3.org/1999/xhtml', 'p' => [ { 'a' => [ { 'href' => 'http://miamiherald.typepad.com/.a/6a00d83451b26169e20133ec6f4491970b-pi', 'style' => 'FLOAT: left', 'img' => [ etc.....
这不是我想要的。我想抓住这个条目里面的内容。我该怎么做呢?
答案 0 :(得分:3)
#!/usr/bin/perl
use strict; use warnings;
use XML::LibXML::Reader;
my $reader = XML::LibXML::Reader->new(IO => \*DATA)
or die "Cannot read XML\n";
if ( $reader->nextElement('content') ) {
print $reader->readInnerXml;
}
__DATA__
<content>
<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://miamiherald.typepad.com/" style="float:left"><img
src="tada"/></a></p>
</div>
</content>
输出:
<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://miamiherald.typepad.com/" style="float:left"><img src="tada"/
></a></p>
</div>
答案 1 :(得分:3)
我的一般规则是当XML::Simple开始失败时,是时候转到另一个XML处理模块了。 XML::Simple
真的应该适用于你不需要考虑的情况。一旦你有一个你必须考虑的奇怪案例,你将不得不做一些额外的工作,我通常觉得很难与XML::Simple
整合。
答案 2 :(得分:2)
如果HTML直接包含在XML中(而不是被转义或在CDATA
内),则XML::Simple无法知道停止解析的位置。
但是,您可以通过将数据结构的该部分传递给XML::Simple
的{{1}}函数来重新构建HTML。
答案 3 :(得分:0)
如果HTML不在CDATA构造内部或以其他方式编码,那么你可以做的就是轻微破解。
在使用XML :: Simple处理之前,找到<my_html>
标记的内容,这些内容可能是可疑的HTML,并通过HTML实体编码器传递它们(“&lt;”=&gt;“&amp; lt'”等。 ..)像HTML :: Entities。然后插入编码内容,而不是<my_html>
标记的原始内容。
这非常黑客,非常容易做错,除非你100%知道正在用正则表达式做什么,而且不应该这样做。
话虽如此,它将解决您的问题。