[PHP-users 10251] Re: 連想配列からXML をつくる関数
Junichi Kuroki
php-users@php.gr.jp
Thu, 19 Sep 2002 16:39:38 +0900
> 長尾です。
>
> PHP の連想配列から、XMLを生成する関数等はないのでしょうか?
> ごく素朴なものなら、つくっても大して難しくはないのですが、
> すでに存在していて、よく使われるものがあったら、それを使いたい
> のです。
>
> よく調べていないで、すぐに見つかるようなものだったら
> すみません。
黒木です。
連想配列ではないですが、インスタンスからXMLを生成する関数を作ってます。
こんなんはいかがでしょうか?
プロパティをタグに変換し、配列プロパティや、インスタンスのネストにも
対応してます(構造化が可)。
プロパティ名の後ろに __atr["属性名"] をつけるとプレフィックスのプロパティ名
に対応した属性になります。
<?php
class XML {
function XML() {}
function obj2xml( &$oObj, $iIndent=0, $iTagSize=2, $stTagName="row", $__atr=array() ) {
if( is_object( $oObj ) ) {
$aVars = get_object_vars( $oObj ) ;
if( $iIndent >= 0 ) {
$stXML = str_repeat( " ", $iIndent*$iTagSize ) ;
$stXML .= "<".$stTagName ;
}
$oItAtr = new Iterator( $__atr ) ;
while( $oItAtr->hasNext() ) {
$stAtrKey = $oItAtr->getKey() ;
$stAtrValue = $oItAtr->next() ;
$stXML .= " ".$stAtrKey."=\"".$stAtrValue."\"" ;
}
if( $iIndent >= 0 ) {
$stXML .= ">".NL ;
}
$aAtrs = array() ;
$oIt = new Iterator( $aVars ) ;
while( $oIt->hasNext() ) {
$stTempKey = $oIt->getKey() ;
$stTempValue = $oIt->next() ;
if( preg_match( "/__atr$/", $stTempKey ) ) {
$aAtrs[$stTempKey] = $stTempValue ;
}
}
$oIt = new Iterator( $aVars ) ;
while( $oIt->hasNext() ) {
$stTempKey = $oIt->getKey() ;
$stTempValue = $oIt->next() ;
if( !preg_match( "/__atr$/", $stTempKey ) ) {
$iIdxAtr = 0 ;
if( is_array( $stTempValue ) ) {
$oItArray = new Iterator( $stTempValue ) ;
while( $oItArray->hasNext() ) {
$oArrayObj = $oItArray->next() ;
$stXML .= XML::obj2xml( $oArrayObj, $iIndent+1, $iTagSize, $stTempKey, $aAtrs[$stTempKey."__atr"][$iIdxAtr] ) ;
$iIdxAtr++ ;
}
} elseif( is_object( $stTempValue ) ) {
$stXML .= XML::obj2xml( $stTempValue, $iIndent+1, $iTagSize, $stTempKey, $aAtrs[$stTempKey."__atr"] ) ;
} else {
$stXML .= str_repeat( " ", ($iIndent+1)*$iTagSize ) ;
$stXML .= "<".$stTempKey ;
$oItAtr = new Iterator( $aAtrs[$stTempKey."__atr"] ) ;
while( $oItAtr->hasNext() ) {
$stAtrKey = $oItAtr->getKey() ;
$stAtrValue = $oItAtr->next() ;
$stXML .= " ".$stAtrKey."=\"".$stAtrValue."\"" ;
}
$stXML .= ">" ;
$stXML .= $stTempValue ;
$stXML .= "</".$stTempKey.">".NL ;
}
}
}
if( $iIndent >= 0 ) {
$stXML .= str_repeat( " ", $iIndent*$iTagSize )."</".$stTagName.">".NL ;
}
} else {
if( $iIndent >= 0 ) {
$stXML .= str_repeat( " ", $iIndent*$iTagSize ) ;
$stXML .= "<".$stTagName ;
}
$oIt = new Iterator( $__atr ) ;
while( $oIt->hasNext() ) {
$stTempKey = $oIt->getKey() ;
$stTempValue = $oIt->next() ;
$stXML .= " ".$stTempKey."=\"".$stTempValue."\"" ;
}
$stXML .= ">" ;
$stXML .= $oObj ;
if( $iIndent >= 0 ) {
$stXML .= "</".$stTagName.">".NL ;
}
}
return $stXML ;
}
}
class Iterator {
var $stKeys ;
var $iIndex ;
var $aArray ;
function Iterator( &$aArray ) {
if( is_array( $aArray ) ) {
$this->stKeys = array_keys( $aArray ) ;
$this->iIndex = 0 ;
$this->aArray = &$aArray ;
} else {
$this->stKeys = array() ;
$this->iIndex = 0 ;
$this->aArray = array() ;
}
}
function hasNext() {
if( $this->iIndex < count( $this->stKeys ) ) {
return true ;
} else {
return false ;
}
}
function getKey() {
if( $this->iIndex < count( $this->stKeys ) ) {
$stKey = $this->stKeys[ $this->iIndex ] ;
return $stKey ;
} else {
return false ;
}
}
function get() {
if( $this->iIndex < count( $this->stKeys ) ) {
$stKey = $this->stKeys[ $this->iIndex ] ;
return $this->aArray[$stKey] ;
} else {
return false ;
}
}
function nextKey() {
if( $this->iIndex < count( $this->stKeys ) ) {
$stKey = $this->stKeys[ $this->iIndex ] ;
$this->iIndex++ ;
return $stKey ;
} else {
return false ;
}
}
function next() {
if( $this->iIndex < count( $this->stKeys ) ) {
$stKey = $this->stKeys[ $this->iIndex ] ;
$this->iIndex++ ;
return $this->aArray[$stKey] ;
} else {
return false ;
}
}
}
?>
(: )('')( :)(..)(: )('')( :)(..)(: )('')( :)(..)
黒木淳一 : kuroki@mycc.co.jp
P.S.R.C. http://www.chamise.jp/mera/index.html
(..)( :)('')(: )(..)( :)('')(: )(..)( :)('')(: )