[유용한팁]Kisa OpenAPI Whois 정보 (XML) 데이터 파싱하기
class XmlParser
{
public $parser;
public $depth=0;
public $termStack;
public $nodeData;
public $fullParseData;
public $prevdepth;
public $uri;
public $last_node;
public $inside_data;
function XmlParser($uri)
{
$this->setURI($uri);
$this->run();
}
function run()
{
$this->termStack = array();
$this->xmlInit();
$this->parsing();
}
function setURI($uri)
{
$this->uri = $uri;
}
function xmlInit()
{
$this->parser = xml_parser_create();
if(!$this->parser) echo "Parser Error<br>";
if(!xml_set_object($this->parser, $this)) echo "xml set object error<br>";
if(!xml_set_element_handler($this->parser, "tag_open", "tag_close")) echo "handler set error<br>";
if(!xml_set_character_data_handler($this->parser, "cdata")) echo "cdata handler error<br>";
}
function cdata($parser, $cdata)
{
if($this->depth > $this->prevdepth)
{
if($this->inside_data)
$this->nodeData[$this->nodeName()] .= $cdata;
else
$this->nodeData[$this->nodeName()] = $cdata;
$this->last_node = $this->nodeName();
}
$this->inside_data=true;
}
function getData($node=null)
{
if($node == null)
{
return $this->fullParseData;
}
return $this->fullParseData[$node];
}
function parsing()
{
$fp = fopen($this->uri, "r");
if(!$fp)
{
return 0;
}
while($data = fread($fp, 9182))
{
$this->parse($data);
}
fclose($fp);
return 1;
}
function parse($data)
{
if(!xml_parse($this->parser, $data)) echo xml_error_string(xml_get_error_code($this->parser));
}
function getpNode($depth=0)
{
if($depth != 0)
{
$node=count($this->termStack) + $depth;
$stack = array_slice($this->termStack, 0, $node);
}
else
{
$stack = $this->termStack;
}
return join("/",$stack);
}
function pushStack($name)
{
array_push($this->termStack, $name);
}
function getStackSize()
{
return count($this->termStack);
}
function tag_open($parser, $tag, $attributes)
{
$this->pushStack($tag);
if($this->depth > $this->prevdepth)
{
if(count($this->nodeData))
{
$last_node = $this->getpNode(-2);
$this->fullParseData[$last_node] = $this->nodeData;
}
$this->nodeData=array();
$this->prevdepth = $this->depth;
}
$this->depth++;
$this->inside_data=false;
}
function tag_close($parser, $tag)
{
$count = count($this->nodeData);
if($count == 0)
array_pop($this->termStack);
$this->depth--;
if($this->depth < $this->prevdepth)
{
if(count($this->nodeData) > 1)
$this->fullParseData[$this->getpNode()][] = $this->nodeData;
else
$this->fullParseData[$this->getpNode()] = $this->nodeData;
$this->nodeData=array();
}
else
{
$this->prevdepth = $this->depth;
}
if($count != 0)
array_pop($this->termStack);
$this->inside_data=false;
}
function nodeName()
{
return $this->termStack[$this->depth-1];
}
}
$parser = new XmlParser('http://whois.kisa.or.kr/openapi/whois.jsp?query='.$ip.'&key=키값');
//print_r($parser);
$items = $parser->getData('WHOIS/KOREAN/USER/TECHCONTACT');
//print_r($items);
foreach($items as $item)
{
$name = $item['NAME'];
$addr = $item['ADDR'];
$phone = $item['PHONE'];
$email = $item['EMAIL'];
}
-----------------------------------------------------------------------------------------------------------
위의 소스는 kisa 에서 지원하는 OpenAPI 의 키를 우선 등록하셔서 사용할 수 있습니다.
선행되어야 하는 작업은 ip 를 받는것입니다.
뭐 $_REQUEST 로 받은 REMOTE_ADDR 로 받든 ip 를 받아내서 그 정보를
kisa 쪽으로 전달해주면 xml 로 return 받을것입니다.
그 값을 저희는 짤라서 쓰기 편하게 파싱작업을 하는것이구요.
foreach 문에서 받은 데이터의 배열을 쓰기편하게 짤라주면 됩니다.
굳이 수정을 한다면 아래 부분만 고쳐 쓰면 됩니다.
$parser = new XmlParser('http://whois.kisa.or.kr/openapi/whois.jsp?query='.$ip.'&key=키값'); // kisa 서버 경로
//print_r($parser);
$items = $parser->getData('WHOIS/KOREAN/USER/TECHCONTACT'); //xml 구조
//print_r($items);
foreach($items as $item)
{
$name = $item['NAME']; //데이터들
$addr = $item['ADDR'];
$phone = $item['PHONE'];
$email = $item['EMAIL'];
}
혹 작업간에 에러가 나거나 출력이 잘 안될때를 대비해 어디서든 디코드가 가능하도록 print_r 사용의 생활화가 되어야 합니다.
늘 주석으로 꼭 포함해서 소스 확인하는 습관을 가지면 더욱 좋습니다.
그럼 이만..<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]</div>
{
public $parser;
public $depth=0;
public $termStack;
public $nodeData;
public $fullParseData;
public $prevdepth;
public $uri;
public $last_node;
public $inside_data;
function XmlParser($uri)
{
$this->setURI($uri);
$this->run();
}
function run()
{
$this->termStack = array();
$this->xmlInit();
$this->parsing();
}
function setURI($uri)
{
$this->uri = $uri;
}
function xmlInit()
{
$this->parser = xml_parser_create();
if(!$this->parser) echo "Parser Error<br>";
if(!xml_set_object($this->parser, $this)) echo "xml set object error<br>";
if(!xml_set_element_handler($this->parser, "tag_open", "tag_close")) echo "handler set error<br>";
if(!xml_set_character_data_handler($this->parser, "cdata")) echo "cdata handler error<br>";
}
function cdata($parser, $cdata)
{
if($this->depth > $this->prevdepth)
{
if($this->inside_data)
$this->nodeData[$this->nodeName()] .= $cdata;
else
$this->nodeData[$this->nodeName()] = $cdata;
$this->last_node = $this->nodeName();
}
$this->inside_data=true;
}
function getData($node=null)
{
if($node == null)
{
return $this->fullParseData;
}
return $this->fullParseData[$node];
}
function parsing()
{
$fp = fopen($this->uri, "r");
if(!$fp)
{
return 0;
}
while($data = fread($fp, 9182))
{
$this->parse($data);
}
fclose($fp);
return 1;
}
function parse($data)
{
if(!xml_parse($this->parser, $data)) echo xml_error_string(xml_get_error_code($this->parser));
}
function getpNode($depth=0)
{
if($depth != 0)
{
$node=count($this->termStack) + $depth;
$stack = array_slice($this->termStack, 0, $node);
}
else
{
$stack = $this->termStack;
}
return join("/",$stack);
}
function pushStack($name)
{
array_push($this->termStack, $name);
}
function getStackSize()
{
return count($this->termStack);
}
function tag_open($parser, $tag, $attributes)
{
$this->pushStack($tag);
if($this->depth > $this->prevdepth)
{
if(count($this->nodeData))
{
$last_node = $this->getpNode(-2);
$this->fullParseData[$last_node] = $this->nodeData;
}
$this->nodeData=array();
$this->prevdepth = $this->depth;
}
$this->depth++;
$this->inside_data=false;
}
function tag_close($parser, $tag)
{
$count = count($this->nodeData);
if($count == 0)
array_pop($this->termStack);
$this->depth--;
if($this->depth < $this->prevdepth)
{
if(count($this->nodeData) > 1)
$this->fullParseData[$this->getpNode()][] = $this->nodeData;
else
$this->fullParseData[$this->getpNode()] = $this->nodeData;
$this->nodeData=array();
}
else
{
$this->prevdepth = $this->depth;
}
if($count != 0)
array_pop($this->termStack);
$this->inside_data=false;
}
function nodeName()
{
return $this->termStack[$this->depth-1];
}
}
$parser = new XmlParser('http://whois.kisa.or.kr/openapi/whois.jsp?query='.$ip.'&key=키값');
//print_r($parser);
$items = $parser->getData('WHOIS/KOREAN/USER/TECHCONTACT');
//print_r($items);
foreach($items as $item)
{
$name = $item['NAME'];
$addr = $item['ADDR'];
$phone = $item['PHONE'];
$email = $item['EMAIL'];
}
-----------------------------------------------------------------------------------------------------------
위의 소스는 kisa 에서 지원하는 OpenAPI 의 키를 우선 등록하셔서 사용할 수 있습니다.
선행되어야 하는 작업은 ip 를 받는것입니다.
뭐 $_REQUEST 로 받은 REMOTE_ADDR 로 받든 ip 를 받아내서 그 정보를
kisa 쪽으로 전달해주면 xml 로 return 받을것입니다.
그 값을 저희는 짤라서 쓰기 편하게 파싱작업을 하는것이구요.
foreach 문에서 받은 데이터의 배열을 쓰기편하게 짤라주면 됩니다.
굳이 수정을 한다면 아래 부분만 고쳐 쓰면 됩니다.
$parser = new XmlParser('http://whois.kisa.or.kr/openapi/whois.jsp?query='.$ip.'&key=키값'); // kisa 서버 경로
//print_r($parser);
$items = $parser->getData('WHOIS/KOREAN/USER/TECHCONTACT'); //xml 구조
//print_r($items);
foreach($items as $item)
{
$name = $item['NAME']; //데이터들
$addr = $item['ADDR'];
$phone = $item['PHONE'];
$email = $item['EMAIL'];
}
혹 작업간에 에러가 나거나 출력이 잘 안될때를 대비해 어디서든 디코드가 가능하도록 print_r 사용의 생활화가 되어야 합니다.
늘 주석으로 꼭 포함해서 소스 확인하는 습관을 가지면 더욱 좋습니다.
그럼 이만..<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]</div>
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 1230 |
|
18년 전 | 2020 | |
| 1229 |
|
18년 전 | 2956 | |
| 1228 |
|
18년 전 | 2642 | |
| 1227 | 18년 전 | 2943 | ||
| 1226 | 18년 전 | 2371 | ||
| 1225 |
|
18년 전 | 2443 | |
| 1224 | 18년 전 | 2754 | ||
| 1223 |
|
18년 전 | 4000 | |
| 1222 |
mixdesign
|
18년 전 | 2639 | |
| 1221 |
|
18년 전 | 2762 | |
| 1220 | 18년 전 | 3219 | ||
| 1219 | 18년 전 | 2927 | ||
| 1218 | 18년 전 | 2124 | ||
| 1217 |
|
18년 전 | 2566 | |
| 1216 | 18년 전 | 2585 | ||
| 1215 |
mixdesign
|
18년 전 | 4070 | |
| 1214 |
|
18년 전 | 4798 | |
| 1213 | 18년 전 | 2332 | ||
| 1212 |
mixdesign
|
18년 전 | 2511 | |
| 1211 |
|
18년 전 | 2437 | |
| 1210 | 18년 전 | 3768 | ||
| 1209 |
mixdesign
|
18년 전 | 2383 | |
| 1208 |
mixdesign
|
18년 전 | 2386 | |
| 1207 |
mixdesign
|
18년 전 | 1735 | |
| 1206 |
mixdesign
|
18년 전 | 2015 | |
| 1205 |
mixdesign
|
18년 전 | 2713 | |
| 1204 |
mixdesign
|
18년 전 | 3585 | |
| 1203 | 18년 전 | 3106 | ||
| 1202 | 18년 전 | 2991 | ||
| 1201 | 18년 전 | 2038 | ||
| 1200 | 18년 전 | 4137 | ||
| 1199 | 18년 전 | 2181 | ||
| 1198 | 18년 전 | 4201 | ||
| 1197 | 18년 전 | 2515 | ||
| 1196 | 18년 전 | 2374 | ||
| 1195 |
|
18년 전 | 3482 | |
| 1194 | 18년 전 | 2252 | ||
| 1193 | 18년 전 | 2158 | ||
| 1192 | 18년 전 | 3278 | ||
| 1191 | 18년 전 | 3971 | ||
| 1190 | 18년 전 | 2232 | ||
| 1189 |
|
18년 전 | 2377 | |
| 1188 |
|
18년 전 | 3841 | |
| 1187 | 18년 전 | 2725 | ||
| 1186 | 18년 전 | 3390 | ||
| 1185 | 18년 전 | 2797 | ||
| 1184 | 18년 전 | 1679 | ||
| 1183 | 18년 전 | 2149 | ||
| 1182 | 18년 전 | 3715 | ||
| 1181 |
mermaid
|
18년 전 | 2932 | |
| 1180 | 18년 전 | 2989 | ||
| 1179 | 18년 전 | 3616 | ||
| 1178 | 18년 전 | 2183 | ||
| 1177 |
|
18년 전 | 2296 | |
| 1176 | 18년 전 | 3187 | ||
| 1175 | 18년 전 | 1890 | ||
| 1174 |
|
18년 전 | 2243 | |
| 1173 |
|
18년 전 | 2533 | |
| 1172 | 18년 전 | 1782 | ||
| 1171 | 18년 전 | 2118 | ||
| 1170 | 18년 전 | 2000 | ||
| 1169 | 18년 전 | 2516 | ||
| 1168 | 18년 전 | 1941 | ||
| 1167 | 18년 전 | 1733 | ||
| 1166 | 18년 전 | 1756 | ||
| 1165 | 18년 전 | 1737 | ||
| 1164 | 18년 전 | 2809 | ||
| 1163 | 18년 전 | 1567 | ||
| 1162 |
|
18년 전 | 5685 | |
| 1161 |
이걸~어쩌나~
|
18년 전 | 2417 | |
| 1160 | 18년 전 | 1676 | ||
| 1159 | 18년 전 | 4708 | ||
| 1158 | 18년 전 | 2059 | ||
| 1157 | 18년 전 | 4848 | ||
| 1156 | 18년 전 | 3197 | ||
| 1155 | 18년 전 | 2140 | ||
| 1154 | 18년 전 | 1839 | ||
| 1153 |
BEST79
|
18년 전 | 2120 | |
| 1152 | 18년 전 | 1740 | ||
| 1151 | 18년 전 | 1850 | ||
| 1150 | 18년 전 | 1854 | ||
| 1149 |
inniskun
|
18년 전 | 2489 | |
| 1148 |
|
18년 전 | 3512 | |
| 1147 |
|
18년 전 | 5982 | |
| 1146 |
|
18년 전 | 3874 | |
| 1145 | 18년 전 | 3066 | ||
| 1144 | 18년 전 | 2154 | ||
| 1143 | 18년 전 | 2426 | ||
| 1142 | 18년 전 | 2215 | ||
| 1141 |
|
18년 전 | 2317 | |
| 1140 | 18년 전 | 2423 | ||
| 1139 | 18년 전 | 2852 | ||
| 1138 | 18년 전 | 2547 | ||
| 1137 | 18년 전 | 2005 | ||
| 1136 | 18년 전 | 3136 | ||
| 1135 | 18년 전 | 3600 | ||
| 1134 | 18년 전 | 3845 | ||
| 1133 |
자반고등어
|
18년 전 | 3352 | |
| 1132 | 18년 전 | 3402 | ||
| 1131 | 18년 전 | 2581 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기