PHP5 XMLファイルと配列を相互に受け渡しをするクラス
<?php
/**
* クラスの説明
* XMLファイルと配列を相互に受け渡しをするクラス
*
* @author k.t
* @since PHP 5.0
*/
class com_xml_array
{
/**
* Arrayに入っている内容を、XMLファイルに書き込む。値はキー値が’text’に格納する。
* @param string $file 書き込むファイル名
* @param Array $array 内容が入ったArray
* @return string
*/
public static function save_array2xml($file,$array,$xml_root_name=’xml_root’)
{
$dom = new DomDocument(‘1.0′,’UTF-8′);
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$parent = new domElement($xml_root_name);
$dom->appendChild($parent);
self::array2xml_recursive($array,$parent,$dom);
$dom->save($file);
}
/**
* 再帰的にarrayの内容をxmlにする.
* @param Array $array
* @param DOMNode $parentarray
* @return
*/
private static function array2xml_recursive($array,&$parent,&$dom)
{
foreach($array as $key => $value)
{
if(is_array($value))
{
$node = $dom->createElement($key);
$parent->appendChild($node);
self::array2xml_recursive($value,$node,$dom);
}
else if(is_string($value))
{
if($key==’text’)
{
$node = $dom->createTextNode($value);
$parent->appendChild($node);
}
else
{
$node = $dom->createElement($key,$value);
$parent->appendChild($node);
}
}
else
{
$node = $dom->createElement($key,$value);
$parent->appendChild($node);
}
}
}
/**
* XMLファイルを読み込んで、Arrayに格納する。ノード中に子ノードを作る場合で、そのタグの値を設定する場合は、キー値が’text’に値を格納する。
* @param string $file ファイル名
* @return Array 読み込んだ結果が入った配列
*/
public static function load_xml2array($file)
{
$dom = new DomDocument(‘1.0′,’UTF-8’);
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
try
{
$ret=$dom->load($file);
if(!$ret) return null;
}
catch(Exceptuin $ex)
{
throw new Exception($ex->getMessage());
}
$array = null;
$root = $dom->childNodes->item(0)->childNodes;
foreach($root as $node)
{
$node_type = $node->nodeType;
if($node_type==XML_TEXT_NODE)
{
$array[‘text’] = $node->nodeValue;
}
else
{
self::xml2array_recursive($node,$array[$node->nodeName]);
}
}
return $array;
}
/**
* 再帰的にXMLの構造をArrayに格納する.
* @param DOMNode $pnode
* @param Array $array
*/
private static function xml2array_recursive($pnode,&$array)
{
if(!$pnode->hasChildNodes()) return;
$child_nodes = $pnode->childNodes;
if($child_nodes->length == 0) return;
foreach($child_nodes as $node)
{
$node_type = $node->nodeType;
if($node_type==XML_TEXT_NODE)
{
$array[‘text’] = $node->nodeValue;
}
else
{
self::xml2array_recursive($node,$array[$node->nodeName]);
}
}
}
}
?>