2010-04-14 121 views
3

我有一個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

回答

3

我的一般原則是,當XML::Simple開始出現故障,它的時間移動到另一個XML處理模塊。 XML::Simple確實應該適用於你不需要考慮的情況。一旦你有一個奇怪的情況,你必須考慮一下,你將不得不做一些額外的工作,我通常會發現很多kludgey與XML::Simple集成。

2

如果HTML直接包含在XML中(而不是被轉義或在CDATA之內),那麼XML::Simple無法知道停止解析的位置。

但是,您可以通過將數據結構的該部分傳遞給XML::SimpleXMLout()函數來重構HTML。

0

如果HTML不在CDATA結構內或以其他方式編碼,您可以做的只是輕微的破解。

與XML ::簡單的處理之前,找到<my_html>標籤這大概是可疑的HTML內容,並通過HTML實體編碼器(」 <‘=>’& LT'」等),如HTML傳遞它們: :實體。然後插入編碼的內容而不是<my_html>標籤的原始內容。

這是非常hacky,很容易做錯,除非你知道100%你正在做的正則表達式,不應該做的。

話雖如此,它將解決您的問題。

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>