1

Mojo::UserAgent->new次の形式の XML を取得するために使用しています。

<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"})
4

1 に答える 1

5

確かに、 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は、指定されたメソッド名 (この場合はtext )の戻り値を持つ Mojo::Collection オブジェクトを返しますこれは、単純なものをマッピングするための素晴らしい方法です。
  • textは、要素のコンテンツを自動的にトリミングします。
  • joinは、Mojo::Collection オブジェクトのすべての要素、この場合tdは a のすべての要素を結合しますrow
  • あなたのコードはコンパイルさえしませんが、atを使用しても機能しません。すべてではなく、最初に一致した DOM 要素だけが返されるからです。すべての行を繰り返します。

チッ!

于 2012-11-08T16:38:22.457 に答える