곰

[유용한팁]Kisa OpenAPI Whois 정보 (XML) 데이터 파싱하기

· 2011-10-18 (화) 16:23:37 · 4023
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>
|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
12-04-10 조회 3,981
12-04-06 조회 5,410
12-04-06 조회 3,184
12-04-04 조회 4,282
12-04-02 조회 3,573
12-03-30 조회 3,528
12-03-29 조회 6,076
12-03-28 조회 3,400
12-03-28 조회 4,325
12-03-27 조회 4,618
12-03-23 조회 3,803
12-03-21 조회 3,532
12-03-20 조회 3,331
12-03-18 조회 3,186
12-03-15 조회 3,361
12-03-12 조회 3,429
12-03-12 조회 3,355
12-03-08 조회 3,686
12-03-03 조회 3,780
12-03-03 조회 3,321
12-02-29 조회 3,622
12-02-28 조회 3,598
12-02-28 조회 3,417
12-02-28 조회 3,545
12-02-27 조회 3,986
12-02-27 조회 3,434
12-02-24 조회 3,526
12-02-24 조회 3,434
12-02-23 조회 3,732
12-02-20 조회 3,743
12-02-20 조회 4,128
12-02-17 조회 4,099
12-02-16 조회 3,287
12-02-15 조회 3,577
12-02-15 조회 3,629
12-02-14 조회 3,599
12-02-08 조회 3,571
12-02-06 조회 3,530
12-02-06 조회 3,949
12-01-25 조회 4,179
12-01-21 조회 4,089
12-01-20 조회 6,201
12-01-15 조회 3,674
12-01-15 조회 3,633
12-01-14 조회 3,527
12-01-14 조회 3,679
12-01-14 조회 3,400
12-01-12 조회 4,183
12-01-12 조회 4,312
12-01-10 조회 3,613
12-01-10 조회 4,455
12-01-09 조회 3,786
12-01-08 조회 7,038
12-01-08 조회 3,253
12-01-07 조회 3,609
12-01-06 조회 3,622
12-01-04 조회 3,770
12-01-03 조회 3,609
12-01-02 조회 4,015
12-01-02 조회 3,195
12-01-01 조회 4,137
12-01-01 조회 3,480
11-12-31 조회 3,744
11-12-31 조회 3,855
11-12-31 조회 3,674
11-12-30 조회 3,930
11-12-30 조회 5,094
11-12-30 조회 4,200
11-12-30 조회 4,363
11-12-30 조회 3,816
11-12-30 조회 3,545
11-12-30 조회 3,560
11-12-29 조회 3,293
11-12-22 조회 3,534
11-12-21 조회 3,481
11-12-20 조회 3,724
11-12-15 조회 5,511
11-12-15 조회 4,499
11-12-14 조회 5,556
11-12-12 조회 3,715
11-12-03 조회 3,490
11-11-26 조회 3,663
11-11-19 조회 3,800
11-11-01 조회 3,155
11-10-23 조회 2,774
11-10-21 조회 2,823
11-10-15 조회 3,202
11-10-15 조회 2,945
11-10-15 조회 3,626
11-10-15 조회 2,856
11-10-14 조회 2,889
11-10-13 조회 2,653
11-10-11 조회 2,894
11-10-10 조회 2,754
11-09-30 조회 3,584
11-09-30 조회 3,025
11-09-29 조회 4,858
11-09-29 조회 2,685
11-09-23 조회 2,758
11-09-16 조회 3,098