2012-11-08 15 views
1

I의 형식은 다음 몇 가지 XML 가져 Mojo::UserAgent->new을 사용하고 아래모조 구문 분석 :: DOM

content1,content2,content3 
content4,content5,content6 

가 같습니다

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

는이 같은 결과를 볼 수 있나요을 나는 다른 resutls를 얻는 것을 사용하고있다.

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

실제 코드를 게시하십시오. 게시 한 라인은 컴파일되지 않습니다. 'at '를 사용하는 것이 왜 효과가 없는지에 대한 설명은 my [answer] (http://stackoverflow.com/a/13293475/1184510)를 참조하십시오. – memowe

+0

여보세요? 살아 있냐? ;) – memowe

답변

5

물론, 그것은 절대적으로 가능하고 어렵지 않다. th 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은 (어떤 find 반환) 컬렉션의 각 요소에 대한 코드 심판을 평가 코멘트.
  • pluck은 주어진 메소드 이름 (이 경우 text)의 반환 값을 가진 Mojo :: Collection 객체를 반환합니다. 이것은 단지 멋진 방법입니다 map 간단한 물건.
  • text은 요소 내용을 자동으로 잘라냅니다.
  • join은 Mojo :: Collection 개체의 모든 요소를 ​​함께 조인합니다.이 경우 모든 td 요소는 row입니다.
  • 코드가 컴파일되지 않지만 at을 사용하면 어쨌든 첫 번째로 일치하는 DOM 요소가 반환되기 때문에 작동하지 않습니다. 모두 행을 반복하고 싶습니다.

HTH!