【问题标题】:Perl: preserving whitespace in empty CDATA block in xml filePerl:在 xml 文件的空 CDATA 块中保留空格
【发布时间】:2015-10-17 15:05:10
【问题描述】:

正如我的标题所示:我有一个包含以下相关内容的 XML 文件

<element>
    <id>ID</id>
    <content>
        <![CDATA[ 



        ]]>
    </content>
</element>

我正在使用 XML::Simple 来解析这个:

$localElement = XMLin( $localElementXML, NoAttr=>1, SuppressEmpty=>'' )

这导致了这个 perl 哈希:

{
  'content' => '',
  'id' => 'ID'
};

如果我在该空 CDATA 块的中间插入除空格以外的任何内容,则所有空格都会保留:

{
  'content' => '


    --


',
  'id' => 'ID'
};

我需要实现的是保留空白(基本上是一个长的空字符串),即使中间没有其他字符。是的,我正在使用“SuppressEmpty”,但我认为该元素不是空的,它是一个充满空格、换行符等的 CDATA 块。我错过了什么吗?我怎样才能让它工作?我还没有找到任何明显的 XML::Simple 选项来改变这种行为。

非常感谢。

【问题讨论】:

  • 简单地说,XML::Simple 是可怕的。不要使用它。它自己的文档说 不鼓励在新代码中使用此模块。其他模块也可以提供更直接和一致的界面。

标签: xml perl xml-parsing


【解决方案1】:

这是你的问题:

我正在使用XML::Simple 来解析这个:

不要。 XML::Simple 甚至说“不要使用这个模块”。

不鼓励在新代码中使用此模块。其他模块也可以提供更直接和一致的接口。

原因很简单——只有非常琐碎(或者实际上是简单)的 XML 片段可以直接通过数组和散列来表示。

XML::Twig怎么样:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new( 'pretty_print' => 'indented_a' )->parse( \*DATA );

$twig->print;

my $content = $twig->root->first_child('content')->text;
print "Content is :\"", $content, "\"\n";

__DATA__
<element>
    <id>ID</id>
    <content>
        <![CDATA[ 



        ]]>
    </content>
</element>

哪些打印:

<element>
  <id>ID</id>
  <content><![CDATA[ 



        ]]></content>
</element>
Content is :" 



        "

当然,从那里开始,下一个问题是 - 你想用那个内容做什么

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多