2012-11-08 104 views
1

我使用Mojo::UserAgent->new获取一些XML具有以下格式:与魔解析:: DOM

<row> 
<td> content1 </td> 
<td> content2 </td> 
<td> content3 </td> 
</row> 
<row> 
<td> content4 </td> 
<td> content5 </td> 
<td> content6 </td> 
</row> 

是否可以查看结果是这样的:

content1,content2,content3 
content4,content5,content6 
下面

是查询我正在使用哪些获得不同的分数

$ua->get($url)->res->dom->at->(row)->children->each(sub {print "$_\t"}) 
+0

请务必发布实际的代码。你发布的行甚至不编译。请参阅我的[回复](http://stackoverflow.com/a/13293475/1184510),解释为什么使用'at'不适合你。 – memowe

+0

你好?你还活着吗? ;) – memowe

回答

5

当然,这是绝对可能的,并不难wi第Mojo::Collection幕后工作。

代码

# replace this line by your existing $ua->get($url)->res->dom code 
my $dom = Mojo::DOM->new(do { local $/ = undef; <DATA> }); 

# pretty-print rows 
$dom->find('row')->each(sub { 
    my $row = shift; 
    say $row->children->pluck('text')->join(', '); 
}); 

数据

__DATA__ 
<row> 
<td> content1 </td> 
<td> content2 </td> 
<td> content3 </td> 
</row> 
<row> 
<td> content4 </td> 
<td> content5 </td> 
<td> content6 </td> 
</row> 

输出

content1, content2, content3 
content4, content5, content6 

所以我评论

  • each评估为集合中的每个元素代码REF(这是什么find回报)。
  • pluck返回一个Mojo :: Collection对象,返回给定方法名称的返回值(在这种情况下为text)。这只是一个奇特的方式map简单的东西。
  • text自动修剪元素内容。
  • join连接在一起的魔精:: Collection对象的所有元素,在这种情况下row的所有td元素。
  • 你的代码甚至没有编译,但使用at将无法​​正常工作,因为它只返回第一个匹配的DOM元素,而不是全部。你想迭代所有的行。

HTH!