[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

(..)( :)('')(: )(..)( :)('')(: )(..)( :)('')(: )