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.....
这不是我想要的是。我想只抓住这个条目中的内容。我该怎么做呢?
答
我的一般原则是,当XML::Simple开始出现故障,它的时间移动到另一个XML处理模块。 XML::Simple
确实应该适用于你不需要考虑的情况。一旦你有一个奇怪的情况,你必须考虑一下,你将不得不做一些额外的工作,我通常会发现很多kludgey与XML::Simple
集成。
答
如果HTML直接包含在XML中(而不是被转义或在CDATA
之内),那么XML::Simple无法知道停止解析的位置。
但是,您可以通过将数据结构的该部分传递给XML::Simple
的XMLout()
函数来重构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>
原始XML的外观如何? “CDATA”部分是HTML吗? – friedo 2010-04-14 20:26:37
为什么正在使用'XML :: Simple'? – 2010-04-15 00:36:51
@Sinan - 是否XML :: LibXML或XML :: Parser包含一些奇特的钩子,允许手动处理内容为CDATA? – DVK 2010-04-15 05:38:39