首页 文章

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

提问于
浏览
3

我有一个XML文件,我从网上和解析 . XML中的一个项目是具有HTML的'content'值 . 我正在使用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.....

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

4 回答

  • 3

    我的一般规则是,当XML::Simple开始失败时,是时候转到另一个XML处理模块了 . XML::Simple 真的应该适用于你不需要做一些额外工作的情况,我通常觉得这些工作很难与_1764580整合 .

  • 0
    #!/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>
    
  • 3

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

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

  • 2

    如果HTML不在CDATA构造内部或以其他方式编码,那么您可以做的就是轻微破解 .

    在使用XML :: Simple进行处理之前,找到 <my_html> 标记的内容,这些内容可能是可疑的HTML,并通过HTML实体编码器("<" => "&lt'"等...)传递它们,如HTML :: Entities . 然后插入编码内容而不是 <my_html> 标记的原始内容 .

    这非常hacky,非常容易做错,除非你100%知道你正在用正则表达式做什么,不应该这样做 .

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

相关问题