[유용한팁]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>
게시판 목록
프로그램
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 |
|---|---|---|---|---|
| 7330 | 11년 전 | 1712 | ||
| 7329 | 11년 전 | 954 | ||
| 7328 | 11년 전 | 2245 | ||
| 7327 | 11년 전 | 1737 | ||
| 7326 | 11년 전 | 3837 | ||
| 7325 | 11년 전 | 2302 | ||
| 7324 | 11년 전 | 4537 | ||
| 7323 |
호식이와미돌
|
11년 전 | 1324 | |
| 7322 |
호식이와미돌
|
11년 전 | 1167 | |
| 7321 | 11년 전 | 1814 | ||
| 7320 | 11년 전 | 1786 | ||
| 7319 | 11년 전 | 1343 | ||
| 7318 |
|
11년 전 | 999 | |
| 7317 |
멋진남자임
|
11년 전 | 1644 | |
| 7316 |
잘살아보자
|
11년 전 | 1011 | |
| 7315 | 11년 전 | 1135 | ||
| 7314 | 11년 전 | 1370 | ||
| 7313 |
잘살아보자
|
11년 전 | 1143 | |
| 7312 | 11년 전 | 900 | ||
| 7311 |
사랑한데이
|
11년 전 | 2103 | |
| 7310 |
잘살아보자
|
11년 전 | 1913 | |
| 7309 |
잘살아보자
|
11년 전 | 3076 | |
| 7308 |
잘살아보자
|
11년 전 | 1031 | |
| 7307 |
잘살아보자
|
11년 전 | 795 | |
| 7306 | 11년 전 | 897 | ||
| 7305 |
잘살아보자
|
11년 전 | 2773 | |
| 7304 | 11년 전 | 1061 | ||
| 7303 | 11년 전 | 1254 | ||
| 7302 | 11년 전 | 769 | ||
| 7301 | 11년 전 | 1547 | ||
| 7300 |
mijaya
|
11년 전 | 1519 | |
| 7299 | 11년 전 | 938 | ||
| 7298 | 11년 전 | 1120 | ||
| 7297 | 11년 전 | 796 | ||
| 7296 | 11년 전 | 765 | ||
| 7295 | 11년 전 | 1588 | ||
| 7294 | 11년 전 | 944 | ||
| 7293 | 11년 전 | 835 | ||
| 7292 | 11년 전 | 924 | ||
| 7291 |
잘살아보자
|
11년 전 | 1110 | |
| 7290 |
잘살아보자
|
11년 전 | 793 | |
| 7289 | 11년 전 | 828 | ||
| 7288 |
잘살아보자
|
11년 전 | 1369 | |
| 7287 | 11년 전 | 853 | ||
| 7286 |
잘살아보자
|
11년 전 | 1356 | |
| 7285 | 11년 전 | 849 | ||
| 7284 | 11년 전 | 999 | ||
| 7283 | 11년 전 | 1026 | ||
| 7282 | 11년 전 | 789 | ||
| 7281 | 11년 전 | 829 | ||
| 7280 | 11년 전 | 1078 | ||
| 7279 | 11년 전 | 2003 | ||
| 7278 | 11년 전 | 834 | ||
| 7277 | 11년 전 | 844 | ||
| 7276 | 11년 전 | 776 | ||
| 7275 | 11년 전 | 1199 | ||
| 7274 | 11년 전 | 841 | ||
| 7273 | 11년 전 | 769 | ||
| 7272 | 11년 전 | 1089 | ||
| 7271 | 11년 전 | 1422 | ||
| 7270 | 11년 전 | 1043 | ||
| 7269 | 11년 전 | 982 | ||
| 7268 | 11년 전 | 1013 | ||
| 7267 | 11년 전 | 1864 | ||
| 7266 | 11년 전 | 925 | ||
| 7265 | 11년 전 | 975 | ||
| 7264 |
잘살아보자
|
11년 전 | 2736 | |
| 7263 |
잘살아보자
|
11년 전 | 2273 | |
| 7262 |
잘살아보자
|
11년 전 | 1149 | |
| 7261 |
잘살아보자
|
11년 전 | 1644 | |
| 7260 |
잘살아보자
|
11년 전 | 1266 | |
| 7259 | 11년 전 | 1182 | ||
| 7258 |
잘살아보자
|
11년 전 | 1312 | |
| 7257 |
잘살아보자
|
11년 전 | 1912 | |
| 7256 | 11년 전 | 959 | ||
| 7255 |
그누5입문
|
11년 전 | 1969 | |
| 7254 | 11년 전 | 2179 | ||
| 7253 |
|
11년 전 | 881 | |
| 7252 | 11년 전 | 1016 | ||
| 7251 | 11년 전 | 733 | ||
| 7250 | 11년 전 | 1705 | ||
| 7249 | 11년 전 | 1562 | ||
| 7248 |
sogo87
|
11년 전 | 1056 | |
| 7247 | 11년 전 | 957 | ||
| 7246 | 11년 전 | 723 | ||
| 7245 |
잘살아보자
|
11년 전 | 1094 | |
| 7244 | 11년 전 | 1546 | ||
| 7243 |
presee
|
11년 전 | 613 | |
| 7242 |
sogo87
|
11년 전 | 801 | |
| 7241 | 11년 전 | 926 | ||
| 7240 |
브라이언2
|
11년 전 | 934 | |
| 7239 |
|
11년 전 | 1148 | |
| 7238 | 11년 전 | 2643 | ||
| 7237 |
잘살아보자
|
11년 전 | 2281 | |
| 7236 |
dethos79
|
11년 전 | 1857 | |
| 7235 |
멋진남자임
|
11년 전 | 1420 | |
| 7234 | 11년 전 | 1359 | ||
| 7233 | 11년 전 | 2340 | ||
| 7232 | 11년 전 | 1621 | ||
| 7231 | 11년 전 | 2803 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기