Perl的XML :: Simple如何忽略XML中嵌入的HTML?

时间:2010-04-14 20:05:44

标签: xml perl parsing

我有一个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.....

这不是我想要的。我想抓住这个条目里面的内容。我该怎么做呢?

4 个答案:

答案 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%知道正在用正则表达式做什么,而且不应该这样做。

话虽如此,它将解决您的问题。