如何从XML :: Simple创建的结构中提取CDATA值?

时间:2010-01-04 09:27:03

标签: xml perl cdata

我使用带有模块XML:Simple的Perl脚本来解析XML提要:

my $xml=XMLin($resp->content);
my $xml2 = $xml->{params}{param}{value}{array}{data}{value}{struct}{member};


print $xml2->{prod_id}{value}{int}; #works fine

print $xml2->{product_text}{value}{string}; #returns a hash reference (hash(0x...)

我需要修改什么来获取文本:

<div class="text"> <div class="text_products">sdfsdf</div> </div>

而不是哈希引用?

这是XML数据:

  <?xml version="1.0" encoding="UTF-8" ?> 
- <methodResponse>
- <params>
- <param>
- <value>
- <array>
- <data>
- <value>
- <struct>
- <member>
  <name>product_text</name> 
- <value>
  <string><![CDATA[ <div class="text"> <div class="text_products">sdfsdf</div> </div> ]]></string> 
  </value>
  </member>
- <member>
  <name>prod_id</name> 
- <value>
  <int>1290</int> 
  </value>
  </member>
- <member>.......

1 个答案:

答案 0 :(得分:0)

您的代码似乎对我有用。我复制了你的XML和你的perl代码并打印出来:

1290 <div class="text"> <div class="text_products">sdfsdf</div> </div> 

使用Data :: Dumper将显示存在的数据结构。例如,当我运行您的示例代码时,相关部分的摘录是:

'value' => {
  'string' => ' <div class="text"> <div class="text_products">sdfsdf</div> </div> '
}

我认为你可能会得到不同的东西的唯一原因是,如果在同一级别有另一个名为product_text的元素。

修改 如果您有时获得空元素并且它们作为hashref出现,则可以在调用SuppressEmpty时将XMLin选项设置为undef。有关详细信息,请参阅文档(链接:https://metacpan.org/pod/XML::Simple#SuppressEmpty-1-undef-in-out---handy