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

问题描述:

我有一个XML文件,我正在从网上解析。 XML中的项目之一是具有HTML的“内容”值。我使用XML::Simple::XMLin解析像这样的文件:当我使用Data::Dumper转储哈希Perl的XML :: Simple如何忽略嵌入在XML中的HTML?

$xml= eval { $data->XMLin($xmldata, forcearray => 1, suppressempty=> +'') }; 

,我发现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..... 

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

+2

原始XML的外观如何? “CDATA”部分是HTML吗? – friedo 2010-04-14 20:26:37

+1

为什么正在使用'XML :: Simple'? – 2010-04-15 00:36:51

+0

@Sinan - 是否XML :: LibXML或XML :: Parser包含一些奇特的钩子,允许手动处理内容为CDATA? – DVK 2010-04-15 05:38:39

我的一般原则是,当XML::Simple开始出现故障,它的时间移动到另一个XML处理模块。 XML::Simple确实应该适用于你不需要考虑的情况。一旦你有一个奇怪的情况,你必须考虑一下,你将不得不做一些额外的工作,我通常会发现很多kludgey与XML::Simple集成。

如果HTML直接包含在XML中(而不是被转义或在CDATA之内),那么XML::Simple无法知道停止解析的位置。

但是,您可以通过将数据结构的该部分传递给XML::SimpleXMLout()函数来重构HTML。

如果HTML不在CDATA结构内或以其他方式编码,您可以做的只是轻微的破解。

与XML ::简单的处理之前,找到<my_html>标签这大概是可疑的HTML内容,并通过HTML实体编码器(” <‘=>’& LT'”等),如HTML传递它们: :实体。然后插入编码的内容而不是<my_html>标签的原始内容。

这是非常hacky,很容易做错,除非你知道100%你正在做的正则表达式,不应该做的。

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

#!/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>