xml 파싱관련 문의 > 그누4 질문답변

그누4 질문답변

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

xml 파싱관련 문의 정보

xml 파싱관련 문의

본문

기존에 올라온 또샵 소셜메타스킨을 적용하였습니다.
http://www.chartshop.co.kr/bbs/board.php?bo_table=tto_social

상품등록은 잘됩니다만...
한가지 오류가 있습니다.

소셜포탈에서 뿌려지는 RSS 를 분석해본결과
할인률이 100% 이거나 판매가격이 0원일 경우 해당 노드값이 아예 없어져서 들어오더군요.

이에따라 노드가 한게시글씩 위로 밀려서 값이 저장되어 버립니다.
고수님들의 답변 꼭꼭~! 부탁드립니다.

반복노드속 자식노드가 없을경우 제외처리 하는 방법을 알고싶은데 좀 어렵네요
소스는 아래와 같습니다.

* 또샵 소셜메타스킨 사용하시는 분들 대부분 겪는 현상일 것으로 생각됩니다.



______________________________________RSS 업데이트 소스_________________________________
<?
/*****************************************************************************************************
** ttoplus_social
**
** Copyright (c) 2011 Yi Seung-Yong (사노라가노라) <www.ttoplus.com> <www.ttoshop.com>
**
** 저작권 안내
**  - 저작권자는 이 프로그램을 사용하므로서 발생하는 모든 문제에 대하여 책임을 지지 않습니다.
**  - 이 프로그램을 어떠한 형태로든 재배포 및 공개하는 것을 허락하지 않습니다.
**  - 이 저작권 표시사항을 저작권자를 제외한 그 누구도 수정할 수 없습니다.
*****************************************************************************************************/
header("Content-Type: text/html; charset=$g4[charset]");
include_once("_common.php");
include_once("$board_skin_path/tto_social.config.php");

set_time_limit(0);
ini_set("memory_limit", "300M");
//ini_set('allow_url_fopen',1); // 추가 php.ini에서 on설정 하거나, .htaccess파일 이용도 가능
$qry="select * from $tto[set_table] where wr_21 = '2' "; // 입점완료 상태만 처리
$rst=sql_query($qry);

for ($i=0; $row = sql_fetch_array($rst); $i++) {
$list[$i]= trim($row[wr_link1]);  $url = $list[$i]; // 처리 xml 주소
$site[$i]= trim($row[wr_link2]); $siteurl = $site[$i];  // 소셜업체 url
$comp[$i]= trim($row[wr_subject]);  $company = $comp[$i]; // 소셜업체명view_table ins 3차분류 사용

$temp = url_fsockopen($url);  // 하단에 정의
$dom = new DOMDocument(); // 객체를 생성한다.
$dom->loadXML($temp); // 파일을 읽는다. (또는 URL)

$domList1 = $dom->getElementsByTagName(trim($row[ca_name])); // 전체 노드
//$channel_title = $domList1->getElementsByTagName('title') ->item(0)->childNodes->item(0)->nodeValue;
//$channel_link = $domList1->getElementsByTagName('link') ->item(0)->childNodes->item(0)->nodeValue;
//$channel_desc =$domList1 ->getElementsByTagName('description') ->item(0)->childNodes->item(0)->nodeValue;
$items = trim($row[wr_homepage]); // item 처리
$domNode2 = $domList1->$items(0); // 반복 노드
$title = $domNode2->getElementsByTagName(trim($row[wr_1])); //  제목 wr_1 -> wr_subject
$area = $domNode2->getElementsByTagName(trim($row[wr_2])); // 지역 wr_2 -> ca_name
$link = $domNode2->getElementsByTagName(trim($row[wr_3])); //  상품 상세url wr_3 -> wr_link1
$shop = $domNode2->getElementsByTagName(trim($row[wr_4])); //  상점명  wr_4 -> wr_name
$photo1 = $domNode2->getElementsByTagName(trim($row[wr_5])); //  상품이미지 wr_5 ->  wr_content
$desc_text = $domNode2->getElementsByTagName(trim($row[wr_6])); // 상품요약설명 wr_6 ->  wr_1
$price_original = $domNode2->getElementsByTagName(trim($row[wr_7])); //  정가 wr_7 ->  wr_2
$sale_percent = $domNode2->getElementsByTagName(trim($row[wr_8])); //  할인율 wr_8 -> wr_3
$price_now = $domNode2->getElementsByTagName(trim($row[wr_9])); // 할인가 wr_9 -> wr_4
$count_min = $domNode2->getElementsByTagName(trim($row[wr_10])); // 최소 판매수 wr_10 -> wr_5
$count_max = $domNode2->getElementsByTagName(trim($row[wr_11])); // 최대 판매수 wr_11 -> wr_6
$sell_count = $domNode2->getElementsByTagName(trim($row[wr_12])); // 현재 판매수 wr_12 -> wr_7
$category = $domNode2->getElementsByTagName(trim($row[wr_13])); //  업종 wr_13 -> wr_8    //  wr_subject -> 소셜업체명 wr_9
$type = $domNode2->getElementsByTagName(trim($row[wr_14])); // 유형 - 미사용 쿠폰=c, 일반상품=g, 이벤트=e wr_14 ->  wr_10
$time_start = $domNode2->getElementsByTagName( trim($row[wr_15])); //  판매시작일 wr_15 -> wr_11
$time_end = $domNode2->getElementsByTagName(trim($row[wr_16])); //  판매종료일 wr_16 -> wr_12
$addr = $domNode2->getElementsByTagName(trim($row[wr_17])); // 상점주소 wr_17 -> wr_13
$tel = $domNode2->getElementsByTagName(trim($row[wr_18])); //  상점전화번호 wr_18 -> wr_14
$latitude = $domNode2->getElementsByTagName((trim($row[wr_19]))); //  상점위도  wr_19 -> wr_15
$longitude = $domNode2->getElementsByTagName(trim($row[wr_20])); //  상점경도  wr_20 -> wr_16
$nAreaLength = $title->length; // item테그의 요소(Element)길이를 가져온다.


for($i = 0; $i < $nAreaLength; $i++) {
  $eday = $time_end->item($i)->textContent;
if($eday >= $sday) {  //  종료일 >= (현재일-몇일전)
// $DOMNodeList->item(integer index) : DOMNode Object

// 요소 조건별 처리 및 기타 변경 (예: 지역이 없으면 모조리 기타로 처리)
$write_table = $tto[view_table]; // 처리게시판 테이블 전체이름
$wr_num = get_next_num($write_table);
$wr_subject =  $title->item($i)->textContent;
$wr_subject = addslashes(strip_tags(trim($wr_subject)));
if(strtolower($g4[charset])=='utf-8') { $wr_subject = $wr_subject; } else { $wr_subject = iconv("utf-8","euc-kr",$wr_subject); } // 추가  - 언어셋 관련은 추가.보완 필요 (제공업체별 xml언어셋통일등?)
if(!$area->item($i)->textContent) { $ca_name = "기타";  } else { $ca_name = $area->item($i)->textContent; }
if(strtolower($g4[charset])=='utf-8') { $ca_name = $ca_name; } else { $ca_name = iconv("utf-8","euc-kr",$ca_name); } // 추가  - 언어셋 관련은 추가.보완 필요 (제공업체별 xml언어셋통일등?)
if(!$link->item($i)->textContent) { $wr_link1 = "";  } else { $wr_link1 = $link->item($i)->textContent; }
if(!$shop->item($i)->textContent) { $wr_name = "";  } else { $wr_name = addslashes(strip_tags(trim($shop->item($i)->textContent))); }
$wr_link2 = $siteurl;
if(!$photo1->item($i)->textContent) { $wr_content = "";  } else { $wr_content = $photo1->item($i)->textContent; }
if(!$desc_text->item($i)->textContent) { $wr_1 = "";  } else { $wr_1 = addslashes(strip_tags(trim($desc_text->item($i)->textContent))); }
if(!$price_original->item($i)->textContent) { $wr_2 = "";  } else { $wr_2 = $price_original->item($i)->textContent; }
if(!$sale_percent->item($i)->textContent) { $wr_3 = "";  } else { $wr_3 = $sale_percent->item($i)->textContent; }
if(!$price_now->item($i)->textContent) { $wr_4 = "";  } else { $wr_4 = $price_now->item($i)->textContent; }
if(!$count_min->item($i)->textContent) { $wr_5 = "";  } else { $wr_5 = $count_min->item($i)->textContent; }
if(!$count_max->item($i)->textContent) { $wr_6 = "";  } else { $wr_6 = $count_max->item($i)->textContent; }
if(! $sell_count->item($i)->textContent) { $wr_7 = "";  } else { $wr_7 = $sell_count->item($i)->textContent; }
if(!$category->item($i)->textContent) { $wr_8 = "이벤트/기타"; } else { $wr_8 = $category->item($i)->textContent; }
if(strtolower($g4[charset])=='utf-8') { $wr_8 = $wr_8; } else { $wr_8 = iconv('utf-8','euc-kr',$wr_8); } // 추가  - 언어셋 관련은 추가.보완 필요 (제공업체별 xml언어셋통일등?)
$wr_9 = $company;
if(!$type->item($i)->textContent) { $wr_10 = "";  } else { $wr_10 = $type->item($i)->textContent; }
if(!$time_start->item($i)->textContent) { $wr_11 = "";  } else {  $wr_11 = $time_start->item($i)->textContent; }
if(!$time_end->item($i)->textContent) { $wr_12 = "";  } else { $wr_12 = $time_end->item($i)->textContent; }
if(!$addr->item($i)->textContent) { $wr_13 = "";  } else {  $wr_13 = addslashes(strip_tags(trim($addr->item($i)->textContent))); }
if(strtolower($g4[charset])=='utf-8') { $wr_13 = $wr_13; } else { $wr_13 = iconv('utf-8','euc-kr',$wr_13); } // 추가  - 언어셋 관련은 추가.보완 필요 (제공업체별 xml언어셋통일등?)
if(!$tel->item($i)->textContent) { $wr_14 = "";  } else {  $wr_14 = $tel->item($i)->textContent; }
if(!$latitude->item($i)->textContent) { $wr_15 = "";  } else {  $wr_15 = $latitude->item($i)->textContent; }
if(!$longitude->item($i)->textContent) { $wr_16 = "";  } else {  $wr_16 = $longitude->item($i)->textContent; }

$sql = "select count(*) from $write_table where wr_link1='$wr_link1'";
$row = sql_fetch($sql);
if($wr_subject == "QC실 테스트"  || $wr_subject == "테스트") { break; }
else if($row['count(*)'] != 0) { sql_query(" update $write_table set wr_7 = '$wr_7' where wr_link1 = '$wr_link1'"); } // 존재하는 것은 현재구매수만 업데이트
else { // 추가
$sql = " insert into $write_table
set wr_num = '$wr_num',
wr_reply = '$wr_reply',
wr_comment = 0,
ca_name = '$ca_name',
wr_option = 'html1,$secret,$mail',
wr_subject = '$wr_subject',
wr_content = '$wr_content',
wr_link1 = '$wr_link1',
wr_link2 = '$wr_link2',
wr_link1_hit = 0,
wr_link2_hit = 0,
wr_trackback = '$wr_trackback',
wr_hit = 0,
wr_good = 0,
wr_nogood = 0,
mb_id = 'admin',
wr_password = 'admin_passd',
wr_name = '$wr_9',
wr_email = '$wr_email',
wr_homepage = '$wr_homepage',
wr_datetime = '$g4[time_ymdhis]',
wr_last = '$g4[time_ymdhis]',
wr_ip = '$_SERVER[REMOTE_ADDR]',
wr_1 = '',
wr_2 = '$wr_2',
wr_3 = '$wr_3',
wr_4 = '$wr_4',
wr_5 = '$wr_5',
wr_6 = '$wr_6',
wr_7 = '$wr_7',
wr_8 = '$wr_8',
wr_9 = '$wr_9',
wr_10 = '$wr_10',
wr_11 = '$wr_11',
wr_12 = '$wr_12',
wr_13 = '$wr_13',
wr_14 = '$wr_14',
wr_15 = '$wr_15',
wr_16 = '$wr_16',
wr_17 = '$wr_17',
wr_18 = '$wr_18',
wr_19 = '$wr_19',
wr_20 = '$wr_20' ";
sql_query($sql);

$wr_id = mysql_insert_id();

// 부모 아이디에 UPDATE
sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");

// 새글 INSERT
//sql_query(" insert into $g4[board_new_table] ( bo_table, wr_id, wr_parent, bn_datetime ) values ( '$tto_viewtb', '$wr_id', '$wr_id', '$g4[time_ymdhis]' ) ");
sql_query(" insert into g4_board_new ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '$tto_viewtb', '$wr_id', '$wr_id', now(), 'admin' ) ", false);

// 게시글 1 증가
sql_query("update g4_board set bo_count_write = bo_count_write + 1 where bo_table = '$tto_viewtb'",false);

}
}
}
}
goto_url("$g4[path]/bbs/board.php?bo_table=$bo_table" . $qstr);  // 완료 후 목록으로

function url_fsockopen($url) {
$url_parsed = parse_url($url);

$host = $url_parsed["host"];
$port = $url_parsed["port"];
if ($port==0)
$port = 80;

$path = $url_parsed["path"];
if ($url_parsed["query"] != "")
$path .= "?".$url_parsed["query"];

$out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
fputs($fp, $out);
$body = false;
while (!feof($fp)) {
$contents = fgets($fp, 128);
if ($body)
$social .= $contents;
if ($contents == "\r\n")
$body = true;
}
fclose($fp);
return $social;
}
}

?>

___________________________________________________________________________
  • 복사

댓글 전체

헛!! 안녕하세요 행님~! ^^ 그분사이트 찾아가서 문의해봤는데 문제는 어느정도 인식하셨는데
다른 해결방안은 제시해 주시진 않으셔서요~

행님은 이미 해결하셨나 봅니다. 부럽 +_+ 힌트좀 주세요~!
값표기가 없을시 기본값을0 표기하면 될듯하네요 조은아이님
그 다음값부터는 밀리지 않겠죠 안되면 우회하라!! 행님에게 배운거네요 이말..ㅎㅎㅎ
값표기가 없을시 우회하라....
일단 노드값이 없을때 우회하는 것은 되는데
노드자체가 없을때 자꾸 오류가 나니원...
일단 더 노력중입니다. ^^ 홧팅~
아우더워.... ㅎ
© SIRSOFT
현재 페이지 제일 처음으로