[유용한팁]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>
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 3830 | 14년 전 | 929 | ||
| 3829 | 14년 전 | 1676 | ||
| 3828 | 14년 전 | 954 | ||
| 3827 |
방황하는중년
|
14년 전 | 903 | |
| 3826 |
|
14년 전 | 1638 | |
| 3825 | 14년 전 | 874 | ||
| 3824 | 14년 전 | 722 | ||
| 3823 | 14년 전 | 735 | ||
| 3822 |
level999
|
14년 전 | 830 | |
| 3821 | 14년 전 | 1015 | ||
| 3820 |
TzM위드컴
|
14년 전 | 935 | |
| 3819 | 14년 전 | 988 | ||
| 3818 |
base64
|
14년 전 | 1098 | |
| 3817 |
base64
|
14년 전 | 963 | |
| 3816 | 14년 전 | 2238 | ||
| 3815 | 14년 전 | 1866 | ||
| 3814 |
|
14년 전 | 2535 | |
| 3813 | 14년 전 | 502 | ||
| 3812 | 14년 전 | 808 | ||
| 3811 | 14년 전 | 1067 | ||
| 3810 | 14년 전 | 670 | ||
| 3809 |
스님꼬신수녀
|
14년 전 | 652 | |
| 3808 | 14년 전 | 1456 | ||
| 3807 | 14년 전 | 1265 | ||
| 3806 | 14년 전 | 2369 | ||
| 3805 | 14년 전 | 1262 | ||
| 3804 | 14년 전 | 850 | ||
| 3803 | 14년 전 | 3369 | ||
| 3802 | 14년 전 | 1592 | ||
| 3801 | 14년 전 | 1005 | ||
| 3800 | 14년 전 | 1357 | ||
| 3799 | 14년 전 | 716 | ||
| 3798 |
커피는막심
|
14년 전 | 1840 | |
| 3797 | 14년 전 | 772 | ||
| 3796 | 14년 전 | 1206 | ||
| 3795 | 14년 전 | 711 | ||
| 3794 |
방황하는중년
|
14년 전 | 1244 | |
| 3793 | 14년 전 | 1479 | ||
| 3792 | 14년 전 | 993 | ||
| 3791 | 14년 전 | 782 | ||
| 3790 | 14년 전 | 1004 | ||
| 3789 | 14년 전 | 931 | ||
| 3788 | 14년 전 | 1950 | ||
| 3787 | 14년 전 | 1113 | ||
| 3786 | 14년 전 | 814 | ||
| 3785 | 14년 전 | 710 | ||
| 3784 | 14년 전 | 1322 | ||
| 3783 | 14년 전 | 2616 | ||
| 3782 | 14년 전 | 705 | ||
| 3781 |
|
14년 전 | 2538 | |
| 3780 |
헬프데스크
|
14년 전 | 1659 | |
| 3779 |
방황하는중년
|
14년 전 | 897 | |
| 3778 |
|
14년 전 | 1100 | |
| 3777 |
|
14년 전 | 1005 | |
| 3776 |
스누피사랑
|
14년 전 | 988 | |
| 3775 |
silver31
|
14년 전 | 500 | |
| 3774 |
|
14년 전 | 714 | |
| 3773 | 14년 전 | 812 | ||
| 3772 |
|
14년 전 | 1174 | |
| 3771 | 14년 전 | 871 | ||
| 3770 | 14년 전 | 1228 | ||
| 3769 | 14년 전 | 1010 | ||
| 3768 |
Dokjin
|
14년 전 | 1111 | |
| 3767 |
Dokjin
|
14년 전 | 713 | |
| 3766 | 14년 전 | 1023 | ||
| 3765 |
|
14년 전 | 919 | |
| 3764 | 14년 전 | 800 | ||
| 3763 | 14년 전 | 689 | ||
| 3762 | 14년 전 | 1171 | ||
| 3761 |
쉽다zzz
|
14년 전 | 1581 | |
| 3760 |
gtm100
|
14년 전 | 936 | |
| 3759 |
원시인교주
|
14년 전 | 778 | |
| 3758 | 14년 전 | 3317 | ||
| 3757 | 14년 전 | 841 | ||
| 3756 | 14년 전 | 731 | ||
| 3755 | 14년 전 | 2125 | ||
| 3754 | 14년 전 | 1511 | ||
| 3753 | 14년 전 | 2025 | ||
| 3752 | 14년 전 | 593 | ||
| 3751 | 14년 전 | 853 | ||
| 3750 |
방황하는중년
|
14년 전 | 713 | |
| 3749 |
hopeone
|
14년 전 | 545 | |
| 3748 | 14년 전 | 633 | ||
| 3747 | 14년 전 | 750 | ||
| 3746 | 14년 전 | 1501 | ||
| 3745 | 14년 전 | 869 | ||
| 3744 | 14년 전 | 908 | ||
| 3743 | 14년 전 | 535 | ||
| 3742 | 14년 전 | 1069 | ||
| 3741 | 14년 전 | 1660 | ||
| 3740 |
매너천사12
|
14년 전 | 1049 | |
| 3739 |
SGFlash
|
14년 전 | 1382 | |
| 3738 |
C2HGroup
|
14년 전 | 904 | |
| 3737 | 14년 전 | 1039 | ||
| 3736 | 14년 전 | 791 | ||
| 3735 | 14년 전 | 1110 | ||
| 3734 | 14년 전 | 1003 | ||
| 3733 | 14년 전 | 417 | ||
| 3732 | 14년 전 | 557 | ||
| 3731 | 14년 전 | 637 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기