[유용한팁]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>
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 4530 |
라이언31
|
13년 전 | 637 | |
| 4529 | 13년 전 | 796 | ||
| 4528 |
꼬꼬아부지
|
13년 전 | 1004 | |
| 4527 | 13년 전 | 612 | ||
| 4526 | 13년 전 | 695 | ||
| 4525 |
|
13년 전 | 1015 | |
| 4524 | 13년 전 | 992 | ||
| 4523 | 13년 전 | 2289 | ||
| 4522 | 13년 전 | 612 | ||
| 4521 | 13년 전 | 1257 | ||
| 4520 | 13년 전 | 1551 | ||
| 4519 |
복이219
|
13년 전 | 1203 | |
| 4518 | 13년 전 | 494 | ||
| 4517 | 13년 전 | 1295 | ||
| 4516 |
아이피마스터
|
13년 전 | 551 | |
| 4515 | 13년 전 | 644 | ||
| 4514 | 13년 전 | 643 | ||
| 4513 | 13년 전 | 1069 | ||
| 4512 |
ananom
|
13년 전 | 4362 | |
| 4511 |
ananom
|
13년 전 | 1479 | |
| 4510 | 13년 전 | 1218 | ||
| 4509 | 13년 전 | 684 | ||
| 4508 | 13년 전 | 846 | ||
| 4507 | 13년 전 | 937 | ||
| 4506 | 13년 전 | 703 | ||
| 4505 | 13년 전 | 629 | ||
| 4504 | 13년 전 | 473 | ||
| 4503 | 13년 전 | 521 | ||
| 4502 |
|
13년 전 | 1807 | |
| 4501 | 13년 전 | 1633 | ||
| 4500 |
|
13년 전 | 504 | |
| 4499 | 13년 전 | 1884 | ||
| 4498 | 13년 전 | 1152 | ||
| 4497 |
미션임파썩을
|
13년 전 | 889 | |
| 4496 | 13년 전 | 941 | ||
| 4495 |
공포의니이킥
|
13년 전 | 1109 | |
| 4494 | 13년 전 | 1978 | ||
| 4493 | 13년 전 | 1062 | ||
| 4492 | 13년 전 | 487 | ||
| 4491 |
두근두근따봉
|
13년 전 | 924 | |
| 4490 | 13년 전 | 1367 | ||
| 4489 |
jaein8060
|
13년 전 | 616 | |
| 4488 | 13년 전 | 1040 | ||
| 4487 |
ReeJang
|
13년 전 | 1820 | |
| 4486 | 13년 전 | 987 | ||
| 4485 | 13년 전 | 807 | ||
| 4484 | 13년 전 | 852 | ||
| 4483 | 13년 전 | 522 | ||
| 4482 | 13년 전 | 1178 | ||
| 4481 | 13년 전 | 1048 | ||
| 4480 |
|
13년 전 | 521 | |
| 4479 | 13년 전 | 912 | ||
| 4478 | 13년 전 | 3964 | ||
| 4477 | 13년 전 | 987 | ||
| 4476 |
wangko
|
13년 전 | 2707 | |
| 4475 | 13년 전 | 928 | ||
| 4474 | 13년 전 | 956 | ||
| 4473 | 13년 전 | 757 | ||
| 4472 |
|
13년 전 | 553 | |
| 4471 | 13년 전 | 1563 | ||
| 4470 | 13년 전 | 572 | ||
| 4469 | 13년 전 | 524 | ||
| 4468 | 13년 전 | 860 | ||
| 4467 | 13년 전 | 658 | ||
| 4466 | 13년 전 | 922 | ||
| 4465 | 13년 전 | 667 | ||
| 4464 | 13년 전 | 1717 | ||
| 4463 |
chongho
|
13년 전 | 2175 | |
| 4462 |
chongho
|
13년 전 | 1025 | |
| 4461 |
chongho
|
13년 전 | 1022 | |
| 4460 | 13년 전 | 753 | ||
| 4459 | 13년 전 | 2779 | ||
| 4458 | 13년 전 | 788 | ||
| 4457 | 13년 전 | 501 | ||
| 4456 | 13년 전 | 1332 | ||
| 4455 | 13년 전 | 1729 | ||
| 4454 | 13년 전 | 716 | ||
| 4453 | 13년 전 | 1253 | ||
| 4452 |
aequum
|
13년 전 | 1270 | |
| 4451 | 13년 전 | 1332 | ||
| 4450 |
도토리과자
|
13년 전 | 1430 | |
| 4449 | 13년 전 | 1091 | ||
| 4448 | 13년 전 | 8619 | ||
| 4447 | 13년 전 | 1204 | ||
| 4446 | 13년 전 | 1485 | ||
| 4445 | 13년 전 | 636 | ||
| 4444 |
|
13년 전 | 609 | |
| 4443 | 13년 전 | 691 | ||
| 4442 |
Msoft
|
13년 전 | 1054 | |
| 4441 |
|
13년 전 | 2103 | |
| 4440 | 13년 전 | 615 | ||
| 4439 | 13년 전 | 1654 | ||
| 4438 |
aequum
|
13년 전 | 1842 | |
| 4437 | 13년 전 | 987 | ||
| 4436 | 13년 전 | 921 | ||
| 4435 |
디귿소프트
|
13년 전 | 516 | |
| 4434 | 13년 전 | 1070 | ||
| 4433 | 13년 전 | 991 | ||
| 4432 | 13년 전 | 853 | ||
| 4431 | 13년 전 | 750 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기