앞서 설명했던 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() 함수를 살펴보면...


(PHP 4 >= 4.2.1)

domxml_new_doc --  Creates new empty XML document
[사용법]
object domxml_new_doc ( string version)
다음과 같이 정의 되어 있으며 입력값으로 version이 들어간다.
문서의 처음에 사용해서 비어있는 xml 문서를 생성해야만 추가작업이 가능하다.
근데 난 한국사람이고 영어문화권을 제외한 나머지 언어를 가진 나라에서는 모든 xml문서를 선언할 때 encoding 값을 줘야한다.
한국어 xml 문서라면...
<?xml version="1.0" encoding="euc-kr"?>
과 같이 써야 한단 소리다.
근데 주어진 xml문서 생성함수로는 구현이 되지 않았다.
그래서, 고민끝에 domxml_open_file(), domxml_open_mem() 함수를 써서 만들어 보기로 했다.
비어있는 xml문서를 만들기 위해서 미리 선언된 양식의 문서가 있어야 한다.
################################### example.inc
<?php
$xmlstr = "<?xml version='1.0' encoding='euc-kr' standalone='yes'?>
<!DOCTYPE HTML SYSTEM 'HTML.dtd'>
<HTML>
</HTML>
";
?>
##########################################################
위에 dtd 문서 선언은 없어도 된다. 하지만 xml문서 선언부와 root element 역할을 하는 tag가 필요하다.
그리고, 이를 php에서 불러서 root element를 불러낸뒤 그뒤에 자식element를 추가해주면 원하는 xml문서를 얻을 수 있다. 물론 xml선언부는 주어진 PHP함수를 사용하지 않고 내 마음데로 조절이 가능하다.
#################################### dom01.php
<?
include("example.inc");
if (!$dom = domxml_open_mem($xmlstr)) {
  echo "Error while parsing the document\n";
  exit;
}
$root = $dom->document_element();
$head = $dom->create_element("HEAD");
$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 "<PRE>";
echo htmlentities($dom->dump_mem());
echo "</PRE>";

?>
####################################################
결과는 다음과 같다.
<?xml version="1.0" encoding="euc-kr" standalone="yes"?> <!DOCTYPE HTML SYSTEM "HTML.dtd"> <HTML> <HEAD><TITLE>This is the title</TITLE></HEAD></HTML>
이와 같은 방법으로 문서를 작성해 나가면 될 것이다.

한글로 인코딩하는 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>

반응형

+ Recent posts