2016-06-17 3 views
0

나는 PHP를 사용하여 자신을 뉴스 페이지로 만들려고합니다. 그러나 나는 약간의 장애물을 만났다. 각 게시물을 분리하여 HTML을 보존하기 위해 한 번에 5 개의 게시물 만로드하려면 이 필요합니다. 나는 처음 두 개를 얻었지만 세 번째 것은 문제가되고있다.PHP에서 XML의 HTML을 보존하려면 어떻게해야합니까?

나는 할 수있는 모든 것을 시도했다. 각 기능이 서로 어떻게 상호 작용하는지 정확히 알지 못하기 때문에 새로운 것을 추가하려고 할 때 항상 무언가를 깨 버립니다. 나는 여기에 saveHTML()을 사용하여 시도했지만 아무 곳에도 아무 것도하지 않거나 무언가를 깨뜨린 다.

내가 원하는 것은 게시물의 내용이 HTML을 보존하고, 일부 게시물의 목록이 정렬되어 있지 않으며, 일부는 링크가 있습니다.

<?php 
    $rss = new DOMDocument(); 
    $rss->load('http://screenbones.com/news.xml'); 
    $feed = array(); 
    foreach ($rss->getElementsByTagName('item') as $node) { 
     $item = array ( 
      'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 
      'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 
      'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 
      'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue, 
      ); 
     array_push($feed, $item); 
    } 
    $limit = 5; 
    for($x=0;$x<$limit;$x++) { 
     $title = str_replace(' & ', ' &amp; ', $feed[$x]['title']); 
     $link = $feed[$x]['link']; 
     $description = $feed[$x]['desc']; 
     $date = date('l F d, Y', strtotime($feed[$x]['date'])); 

     echo '<article>'; 
     echo '<p><strong><a href="'.$link.'" title="'.$title.'">'.$title.'</a></strong><br />'; 
     echo '<small><em>Posted on '.$date.'</em></small></p>'; 
     echo $description; 
     echo '</article>'; 
    } 
?> 
+1

당신은 'desc'=> $ rss-> saveHTML ($ node-> getElementsByTagName ('description') -> item (0)), ' – Musa

+0

@Musa를 시도 해본 적이 있습니다. 경고 : DOMDocument :: saveHTML()은 정확히 0 개의 매개 변수를 필요로합니다. 1 줄에 .../feedTest.php 34 줄에 –

+0

어떤 PHP 버전을 사용하고 있습니까? – Musa

답변

0

당신은 단지 텍스트 내용입니다 <description>nodeValue 속성을 읽고 : 그런데

, 여기에 코드입니다. 노드 대신 DOMDocument::saveHTML() 메소드를 사용하십시오.

편집 : 크레딧은 Musa입니다. 내 원래의 대답은 틀렸어. < 기사 > 태그 직렬화 된 XML로 설명 요소에

+0

nodeValue를 saveHTML로 바꾸면 saveHTML()을 사용하여 게시물 내용이 표시되지 않지만 다음과 같이 표시됩니다. 치명적 오류 : 정의되지 않은 메소드 DOMElement :: saveHTML()을 호출합니다. 34 번째 줄에있는 feedTest.php. 이것은 내가 시도한 것입니다 : 'desc '=> $ node-> getElementsByTagName ('description ') -> item (0) -> saveHTML()' –

+0

'saveHTML() DOMDocument'가 아니라 DOMElement입니다. 이것을 대신해보십시오 :''desc '=> $ rss-> saveHTML ($ node-> getElementsByTagName ('description ') -> item (0)),' – ShiraNai7

+0

그 코드의 문제점은 saveHTML ,이를 실행하면 오류가 발생합니다. –

0

는 일반적으로 RSS 피드를 사용 CDATA 섹션/텍스트 필드 .. 나 영업 이익은 어떤 이유로 XML을 생산했다 생각했다. 귀하의 경우에는 네임 스페이스를 정의하지 않고 XHTML이 사용됩니다.

$document = new DOMDocument(); 
$document->load('http://screenbones.com/news.xml'); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('//item[position() <= 5]') as $item) { 
    $title = $xpath->evaluate('string(title)', $item); 
    $link = $xpath->evaluate('string(link)', $item); 
    $date = date('l F d, Y', strtotime($xpath->evaluate('string(date)', $item))); 

    if ($xpath->evaluate('count(description/*) > 0', $item)) { 
    $descriptionFragment = ''; 
    foreach ($xpath->evaluate('description/node()', $item) as $content) { 
     $descriptionFragment .= $document->saveHtml($content); 
    } 
    } else { 
    $descriptionFragment = $xpath->evaluate('string(description)', $item); 
    } 

    printf (
    '<article> 
     <p><strong><a href="%1$s" title="%2$s">%2$s</a></strong><br /> 
     <small><em>Posted on %2$s</em></small></p> 
     %3$s 
    </article>', 
    htmlspecialchars($link), 
    htmlspecialchars($title), 
    htmlspecialchars($date), 
    $descriptionFragment 
); 
} 

이 예제에서는 노드와 값을 가져올 수있는 Xpath 표현식을 사용합니다.

첫 번째 표현 //item[position() <= 5]은 첫 번째 다섯 개의 item 요소를 가져옵니다. 다른 표현식의 경우 $item 노드가 컨텍스트로 사용되므로 상대 노드입니다.

표현식은 string(title)이며 이름으로 요소 노드를 가져 와서 첫 번째로 발견 된 노드를 문자열로 변환합니다. 노드가 발견되지 않으면 빈 문자열을 리턴합니다.

count(description/*) > 0 여기에 텍스트/cdata 노드뿐만 아니라 설명 안에 요소 노드가 있는지 확인합니다. 이 경우 설명의 모든 하위 노드를 반복하여 HTML로 직렬화합니다. 그렇지 않으면 단일 텍스트 노드를 직렬화 된 HTML로 읽습니다.

htmlspecialchars()은 HTML 출력을 위해 &과 같은 문자를 이스케이프 처리하는 데 사용됩니다. $descriptionFragment을 조심하십시오. 그것은 외부 소스에서 직접 HTML입니다. 그것을 사용하기 전에 정리하는 것이 좋습니다.

+0

saveHTML을 사용하면 PHP는 매개 변수가 주어 졌다고 불평하며 0을 원합니다. –

+0

즉, 정말 오래된 (안전하지 않은) PHP 버전이 있음을 의미합니다. 그러나 모든 노드를 별도의 문서로 복사하여 저장할 수 있습니다. – ThW

+0

나는 그것이 구버전임을 깨닫는다. 내 웹 호스트를 통해 업데이트 할 수있는 옵션이 표시되지 않습니다. –

관련 문제