앞서 설명했던 XML스키마나 DTD를 활용하는 것 까지는 아니라도
가장 기초적인 단순 Tag타입의 XML 파일을 만들수 있게 되었다.
<?
// xml 버전라인
$doc = domxml_new_doc("1.0");
// <HTML> element 선언
$root = $doc->create_element("HTML");
// 자식 element로 <HTML> 추가
$root = $doc->append_child($root);
$head = $doc->create_element("HEAD");
// <HEAD>를 <HTML>의 자식으로 추가 $doc->$root
$head = $root->append_child($head);
$title = $doc->create_element("TITLE");
// <TITLE>을 <HEAD>의 자식으로 추가 $doc->$root->$title
$title = $head->append_child($title);
// <TITLE>에 텍스트노드 추가
$text = $doc->create_text_node("This is the title");
$text = $title->append_child($text);
echo "<PRE>";
// 메모리를 덤프해서 htmlentitie로 표시
echo htmlentities($doc->dump_mem());
echo "</PRE>";
?>
다음의 소스코드를 그대로 .php 로 저장해서 실행시켜보면 다음과 같은 결과를 볼 수 있다.
<?xml version="1.0"?> <HTML><HEAD><TITLE>This is the title</TITLE></HEAD></HTML> echo를 할때 htmlentities() 함수 대신....$doc->dump_file("/tmp/test.xml", false, true);dump_file()함수를 쓰면 xml파일을 얻을 수 있게 된다.
모든 xml은 다음과 같은 정의를 최상단에 단 한번만 주어야 한다.
<?xml version="1.0"?>
이것은 "이 문서는 xml표준 버전 1.0 의 규칙에 따른다..." 라는 것을 정의함을 의미한다.
그리고, 내가쓰는 PHP4 에서 사용되는 domxml_new_doc() 함수를 살펴보면...
$xmlstr = "<?xml version='1.0' encoding='euc-kr' standalone='yes'?>
<!DOCTYPE HTML SYSTEM 'HTML.dtd'>
<HTML>
</HTML>
";
?>
echo "Error while parsing the document\n";
exit;
}
$head = $root->append_child($head);
$title = $dom->create_element("TITLE");
$title = $head->append_child($title);
$text = $dom->create_text_node("This is the title");
$text = $title->append_child($text);
echo htmlentities($dom->dump_mem());
echo "</PRE>";
?>
한글로 인코딩하는 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)
적용해보니 한글을 잘 뿌릴 수 있게 되었다.
이제 걸리는 문제는 모두 해결하게 되었다.
이제부터 문서를 만드는 일만 남았다.
[소스]
폼을 통해 전달해주는 문서 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);
?>
[결과]
'Useful Tips > SㆍW' 카테고리의 다른 글
EditPlus C,Java, C++ 컴파일 하기 (0) | 2006.09.18 |
---|---|
매우 유용한 팁 - 각종 윈도우 설정 고정방법 (2) | 2006.08.18 |
웹개발시 MVC 패턴을 적용하는 일반적인 목적 (0) | 2006.07.18 |
싸이월드 BGM 플레이어 제거 프로그램(인터넷 속도 향상) (0) | 2006.07.18 |
Template_ 사용방법 메뉴얼 (0) | 2006.07.18 |