IT_Programming/XML

PHP의 DOM함수로 XML 만들기(3. 한글을 마음데로 써보자...)

JJun ™ 2007. 9. 30. 13:11

아... PHP에 대한 내공이 부족하다보니 무수한 삽질을 반복하고 있다.

 

PHP의 DOM함수로 XML 만들기(2)까지를 통해서 XML 문서를 생성하는것 까지 해보곤 뿌듯해 하고 있었다.

 

naver 검색창에서 PHP DOM 으로 검색해서 내 글이 검색에 걸린것 같다.

그래서, 그런지 블로그 사용자가 아닌 사람들의 방문숫자가 많이 늘었다.

내가 "이정도면 xml을 학습의 기본은 다 닦았다..." 싶을 때 까지 쌓이는 문서가 많은 사람들에게 보탬이 되었으면 한다.

 

몇 달전 까지도 서점엔 아직 PHP로 XML게시판 만들기에 관련된 책은 없으며...

현재 PHP에서 제공한 XML관련 함수도 계속 버그를 수정해 나가는 중이다.

물론 PHPschool 같은 큰 커뮤니티쪽에서도 게시물 수도 적고... 있다해도 나같은 초보가 볼 수 있는 구체적인 글보다는 개념만 두리뭉실 설명하는 수준... 아니면 설치관련 글들 뿐이드라...

 

물론 벌써 게시판을 만들어서 운영중인 사람들도 많다.

아마 정보 공개를 꺼리는 듯 싶다. 이것도 엄연히 밥벌이 기술이기엔 충분하지 않을까 한다. (^^);

 

아무튼 해보는데 까지 해볼 참이고, 나름데로 의욕이 앞서는데 참고 할 것이 없는 내공이 부족한 나같은 프로그래머들에게 두서없는 경험담식의 웹출판을 해보겠다. (^^);

 

 

 

 

한글로 인코딩하는 xml 선언문까지 해결보고나서 문서를 만들려던중

create_element() , create_text_nod, set_content() 같은 함수들에 한글을 입력하게 되었다.

그러면...

 

Warning: dump_file(): output conversion failed due to conv error in D:\XML\ex01.php

on line 60
Warning: dump_file(): Bytes: 0xC0 0xCC 0xB8 0xA7 in D:\XML\ex01.php on line 60
Warning: dump_file(): xmlOutputBufferFlush: encoder error in D:\XML\ex01.php on line 60

 

다음과 같은 에러가 발생했다.

output 버퍼가 어쩌구... -_-;

 

한글을 써야할텐데... 이러면 낭패다.

 

열씸히 검색해보니 php.ini에 가서 buffer,flush 관련 항목의 주석제거와 알맞게 샛팅후 다시 써보라는둥... 혹 윈도우버전이라 안되는건 아닐까... 모듈이 없는건 아닐까 고민고민했다.

그러다가 나와 같은 에러를 갖은 사람의 문서를 찾게 되었고 그 문서를 통해서 해답을 찾는듯 했다.

 

http://bugs.php.net/bug.php?id=26443

 

결론이 난 이문서의 최종 해결책은

Please try using this CVS snapshot:

 
http://snaps.php.net/php4-STABLE-latest.tar.gz
  http://snaps.php.net/win32/php4-win32-STABLE-latest.zip

다음과 같은 STABLE 버젼을 다시 설치하고 해보라했다.

웹서버의 종류도 특성이 있는듯 했고 window용에 대한 언급도 있었다.

 

내공이 부족해서 시키는데로 했다.

 

덕분에 새로운 팁을 익히게 되었지만 한글을 뿌리게끔 현실적으로 보탬이 되진 않았다.

계속 찾아 헤매던중 eocoding쪽에 관련이 있을것 같아서 문서 검색을 해보니...

 

xml 파서함수의 uft8-encode() 함수를 쓰도록 하고있었다.

그래서, 해봤다... 이제 위와같은 버그는 없었다. 다만 읽을수 없는 문자가 난무했다.

이유인 즉슨 ISO-8859-1 문자열을 UTF-8 로 바꿈에 있었다.

 

PHP내공이 부족해서 대책을 바로 찾지 못했는데 한글문자열은 UTF-8 포맷으로 바꿔줘보기로 했다.

 

iconv 함수를 이용해서...

 

string iconv ( string in_charset, string out_charset, string str)

 

예 1. iconv() example:

echo iconv("ISO-8859-1","UTF-8","This is test.");

 

적용해보니 한글을 잘 뿌릴 수 있게 되었다.

이제 걸리는 문제는 모두 해결하게 되었다.

 

이제부터 문서를 만드는 일만 남았다.

 

 

[소스]

 

폼을 통해 전달해주는 문서 index.html

 

<form name=form1 method=POST action=ex01.php?X=KKK>
<input type=hidden name=rootName value="EXTEXT">
<table border=1>
  <tr>
    <td>name</td>
 <td><input type=text name=name></td>
  </tr>
  <tr>
    <td>title</td>
 <td><input type=text name=title></td>
  </tr>
  <tr>
    <td>content</td>
 <td><textarea name=content></textarea></td>
  </tr>
  <tr>
    <td></td>
 <td><input type=submit></td>
  </tr>
</form>

 

넘어온 form 값을 XML로 만들어주는 PHP프로그램 ex01.php

 

<?
print_r($_REQUEST);


if(!array_key_exists("rootName",$_REQUEST)) {
 ///////// 넘어온 폼에서 rootName값이 없을 경우 default XML root element value를 만들어준다.

 set "TEMPTEXT"
 $RootName="TEMPTEXT";
} else {
 //////// 있다면 그냥 준다.
 $RootName=$_REQUEST["rootName"];
 unset($_REQUEST["rootName"]);
}

/////////////////////////////// XML root ELEMENT(부모) 생성
$xmlstr = "<?xml version='1.0' encoding='euc-kr'?><$RootName></$RootName>";

if (!$dom = domxml_open_mem($xmlstr)) {
  echo "Error while parsing the document\n";
  exit;
}
$root = $dom->document_element();
////////////////////////////////////////////////////////////////


foreach($_REQUEST as $key=>$value) {

$$key = $dom->create_element($key);
$$key = $root->append_child($$key);
$$key->set_content(iconv("EUC-KR","UTF-8",$value));

}


//echo htmlspecialchars($dom->dump_mem(1, 'euc-kr'));
echo $dom->dump_mem(true);
//echo htmlentities($dom->html_dump_mem());

/// xml문서로 바로 남기고 자 하면 dump_file을 쓴다.
//$dom->dump_file("result.xml", false, true);
?>

 

 

 

[결과]

 

<?xml version="1.0" encoding="euc-kr" ?>
 -<EXTEXT>
  <X>KKK</X>
  <name>이름</name>
  <title>제목</title>
  <content>내용</content>
</EXTEXT>

 

 

이젠 xml문서 디자인만 남은듯 하다......

DOM 함수로 XML문서 만들기는 여기까지만 하겠다. ^^