php에서 xml출력하기 질문 (1만 포인트) > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

php에서 xml출력하기 질문 (1만 포인트) 정보

php에서 xml출력하기 질문 (1만 포인트)

본문

아래처럼 짰는데요....
http://www.newsgate.co.kr/rss_test.php
이런식으로 xml로 출력되야는데...
http://www.newsgate.co.kr/rss.php
이렇게 출력됩니다.
아래코드를 첨부 합니다.
어떤게 잘못 됬을까요?

<?php
/*
/////////////////////////////////////////////////////////
// 제작 : 테러보이스
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
// xml 셋팅
/////////////////////////////////////////////////////////
// 데이터만 출력
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
header("Content-type: text/xml");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
*/

echo "<?xml version=\"1.0\" encoding=\"euc-kr\"?>";
echo "<NEWS>";

/*
/////////////////////////////////////////////////////////
// 데이터 셋팅
/////////////////////////////////////////////////////////
*/

if(!defined("_INCLUDE_")){//페이지 자체가 url인 경우 즉 다른 페이지에 포함된페이지가 아닌경우
     include $DOCUMENT_ROOT . "/lib/include.php";
}

$que = "SELECT * FROM sessions WHERE use_flag = 'Y' AND menu_id >= '10000' AND menu_id <= '130000' AND sub_id = '0'";
$db->query($que);
global $i;
$i=0;
while($db->next_record()) {
	$data = $db->Record;
	$db2 = new $Fun->databaseclass; 
	
	$start_date = mktime(0,0,0,date("m"),date("d"),date("Y"));
	$end_date = mktime(23,59,59,date("m"),date("d"),date("Y"));	

	$que2 = "SELECT * FROM B".$data[menu_id]."_bbs_contents ORDER BY reg_date DESC LIMIT 0,4";
	$db2->query($que2);
	
	while($db2->next_record()) {
		$data2 = $db2->Record;
		$data3[$i][cno] = $data2[cno];
		$data3[$i][session] = $data[menu_id];
		$data3[$i][session_name] = $data[menu_name];
		$data3[$i][subject] = $data2[subject];
		$data3[$i][reg_date] = $data2[reg_date];
		$data3[$i][contents] = $data2[contents];
		$data3[$i][name] = $data2[name];
		$data3[$i][email] = $data2[email];
		
		$i++;
	}
}

$loop = count($data3);

for($i=0; $i < $loop; $i++) {
	for($j=0; $j < $loop-1; $j++) {
		if($data3[$j][reg_date] < $data3[$j+1][reg_date]) {
			$temp1 = $data3[$j+1][reg_date];
			$temp2 = $data3[$j+1][cno];
			$temp3 = $data3[$j+1][session];
			$temp4 = $data3[$j+1][session_name];
			$temp5 = $data3[$j+1][subject];
			$temp6 = $data3[$j+1][contents];
			$temp7 = $data3[$j+1][name];
			$temp8 = $data3[$j+1][email];

			$data3[$j+1][reg_date] = $data3[$j][reg_date];
			$data3[$j+1][cno] = $data3[$j][cno];
			$data3[$j+1][session] = $data3[$j][session];
			$data3[$j+1][session_name] = $data3[$j][session_name];	
			$data3[$j+1][subject] = $data3[$j][subject];
			$data3[$j+1][contents] = $data3[$j][contents];
			$data3[$j+1][name] = $data3[$j][name];
			$data3[$j+1][email] = $data3[$j][email];
	
			$data3[$j][reg_date] = $temp1;
			$data3[$j][cno] = $temp2;
			$data3[$j][session] = $temp3;
			$data3[$j][session_name] = $temp4;
			$data3[$j][subject] = $temp5;
			$data3[$j][contents] = $temp6;
			$data3[$j][name] = $temp7;
			$data3[$j][email] = $temp8;
		}
	}
}


for ($i=0; $i<"10"; $i++) {
echo "<DATETIME>".$Data_Time."</DATETIME>";
echo "<WRITER_LIST>";
echo "<WRITER>";
echo "<NAME>".$data3[$i][name]."</NAME>";
echo "<EMAIL>".$data3[$i][email]."</EMAIL>";
echo "</WRITER>";
echo "</WRITER_LIST>";
echo "<CATEGORY_LIST>";
echo "<CODE>culture</CODE>";
echo "</CATEGORY_LIST>";
$subject = $Fun->recoverhtml(stripslashes($data3[$i][subject])); 
$subject = $Fun->cutstr($subject,"65","...");
echo "<TITLE>".$subject."</TITLE>";
echo "<TEXT>".$contents."</TEXT>";
echo "<EXT>";
echo "<OUTLINK>http://www.newsgate.co.kr/read.php?session_id=".$data3[$i][session]."&num=".$data3[$i][cno]."</OUTLINK>";
echo "<COPYRIGHT><![CDATA[모든 저작권은 뉴스게이트에 있습니다.]]></COPYRIGHT>";
echo "</EXT>";
}
echo "</NEWS>";
?>


114번째 줄은 이상하게 풀어져 버리는데
echo "<OUTLINK>http://www.newsgate.co.kr/read.php?session_id=".$data3[$i][session]."&num=".$data3[$i][cno]."</OUTLINK>"; 이거입니다.^^

XML형식은 다음 뷰에 맞춘것 입니다.

댓글 전체

<out...><![CDATA[]></out>...

모든 데이터를 ><![CDATA[]> 사이에 넣어야 안전 합니다.

< 태그는 xml에서 중요한 태그이므로 <a href 하면 하나의 xml 태그로 인식하지 <a 태그로 인식하지
않습니다.
XML트리 형식으로 뿌려지게 하고 싶다는 질문입니다.^^

<![CDATA[]]>
이걸 안쓴이유는 데이터 값 불러올때 문제가 약간 생겨서 잠시 지워본것입니다.
그쵸? 에러도 안나고 구문도 정상인데..
익스 8 에서 소스 보기하면 테그들이 색색깔로 변하잖아요?
<?xml version="1.0" encoding="euc-kr"?>
이부분만 검정이라..
이부분이 문제인것같은데... ㅎㄷㄷ 합니다 ㅋㅋ
ㅠ.ㅠ;;;
어떻해야하나.. ㅠ.ㅠ;
먼저 114줄을 요렇게 수정해보세요. 일단 값을 받아야 테스트를 할텐데 현재 상태에서는 값을 못 받고 있을 겁니다.
echo "<OUTLINK><a href=\"http://www.newsgate.co.kr/read.php?session_id=\" target=\"_blank\">http://www.newsgate.co.kr/read.php?session_id=</a>".$data3[$i][session]."&num=".$data3[$i][cno]."</OUTLINK>";
그리고 정확히 어떤 내용만 추출하실 것인지 제가 소스상으론 이해가 가질 않네요. 전부 다 출력하는 것으로 되어 있는데 말입니다. 트리구조라는 것은 아마도 부모 아래 자식들을 차례대로 뿌리는 것을 말씀하시는 것 같은데 그렇게 따지면 또 소스가 맞고요. 타이틀만 나오는 것이 잘못된 것인가요? 답변 달면서 저도 헷갈리네요. xml 초보라...
데이터 출력하는 부분은 이상이 없는것 같은데요??

http://www.newsgate.co.kr/rss.php
링크로 출력되는 텍스트 바로 위에

<?
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: text/xml; charset=utf-8");
echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
?>

이렇게만 추가해줘도 브라우저에서 XML 포맷으로 출력됩니다.

http://test.webiz.kr/20100722_xml.php

이렇게 말이죠..
혹시 html값이 문제 인가해서

// 컨텐츠 내용 수정코드 -- 엔터, html코드, &nbsp; 제거////////////////////
$contents = $Fun->recoverhtml(stripslashes($data3[$i][contents]));
$contents = preg_replace("/&nbsp;+/"," ",$contents); // 공백소스 풀어짐 제거
$search = array("\r\n", "\n"); // 엔터제거1
$contents = str_replace($search, "<br />", $contents); // 엔터제거2
$contents = strip_tags($contents); //html코드제거
$contents = $Fun->cutstr($contents,"500","...");  // 글자자름
/////////////////////////////////////////////////////////////////////////

이렇게 처리 했구요.
문제는 echo "<?xml version=\"1.0\" encoding=\"euc-kr\"?>";  이게 인식을못하고 텍스트로 뿌려지는것 같습니다. 소스보기 하여 나오는 xml문서를 복사해서 xml로 출력결과 정상출력됩니다.
혹시 html값이 문제 인가해서

// 컨텐츠 내용 수정코드 -- 엔터, html코드, &nbsp; 제거////////////////////
$contents = $Fun->recoverhtml(stripslashes($data3[$i][contents]));
$contents = preg_replace("/&nbsp;+/"," ",$contents); // 공백소스 풀어짐 제거
$search = array("\r\n", "\n"); // 엔터제거1
$contents = str_replace($search, "<br />", $contents); // 엔터제거2
$contents = strip_tags($contents); //html코드제거
$contents = $Fun->cutstr($contents,"500","...");  // 글자자름
/////////////////////////////////////////////////////////////////////////

이렇게 처리 했구요.
문제는 echo "<?xml version=\"1.0\" encoding=\"euc-kr\"?>";  이게 인식을못하고 텍스트로 뿌려지는것 같습니다. 소스보기 하여 나오는 xml문서를 복사해서 xml로 출력결과 정상출력됩니다.
http://richarea.net/tests/xml_test_1.php 이렇게 나와야 하는 거죠?

xml 형식으로 나오지 않는 이유는 header를 주석처리 한것이 문제입니다.
Header("Content-type: text/xml; charset=euc-kr"); 이렇게 넣고 주석을 빼주셔야 되요. 그렇지 않으면 암만 <?xml 선언해도 의미없습니다.

그리고 데이터는 CDATA형식으로 묶는 것은 아실테고 또 그 안에 들어갈 데이터에서 & 이 들어있으면 반드시 &amp;형식으로 변환되어야 문제가 안생깁니다. 위에 링크건 예제의 소스를 보고 분석해보세요.

제가 위에서 htmlspecialchars 를 쓴 이유는 이 함수가 이런 것들을 자동적으로 전환을 하기 때문에 그럽니다.

$contents = preg_replace('/"/', '\\"', htmlspecialchars($contents)); 이렇게 추가를 하신 후에 CDATA로 묶어도 되구요.
말씀하신 소스로 바꾸었습니다.
출력 형식을
echo <<<HEREDOC 로 바꾸고 Header도 추가하니 일단 xml문소로는 출력 되지만.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
XML 문서에는 최상위 요소가 하나만 있을 수 있습니다. 'http://www.newsgate.co.kr/rss/rss.php' 리소스를 처리하는 데 오류가 발생했습니다. 줄 20, 위치 2

<NEWS>
-^
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
이렇게 뜹니다. <분명 최상위  요소는 하나가 아닌데... 그래서 최상위 요소를 하나더 끼워넣어도 안되는군요. 아래는 xml 출력부분 소스입니다.>
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

echo <<<HEREDOC
<?xml version="1.0" encoding="euc-kr"?>
<NEWS>
<DATETIME>{$data_time}</DATETIME>
<WRITER_LIST>
<WRITER>
<NAME>{$data3[$i][name]}</NAME>
<EMAIL>{$data3[$i][email]}</EMAIL>
</WRITER>
</WRITER_LIST>
<CATEGORY_LIST>
<CODE>culture</CODE>
</CATEGORY_LIST>
<TITLE>{$data3[$i][subject]}</TITLE>
<TEXT>{$contents}</TEXT>
<EXT>
<OUTLINK><![CDATA[http://www.newsgate.co.kr/read.php?session_id=".$data3[$i][session]."&num=".$data3[$i][cno]."]]></OUTLINK>
<COPYRIGHT><![CDATA[모든 저작권은 뉴스게이트에 있습니다.]]></COPYRIGHT>
</EXT>
</NEWS>
HEREDOC;
전체 110 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT