2009-07-30 14 views
2

は、私はこのような配列を持っていると言う:PHP配列をXMLに変換していますか?

<?php 
$colors=array(); 

$colors[0]['id']=1; 
$colors[0]['color']='blue'; 


$colors[1]['id']=2; 
$colors[1]['color']='green'; 

...... 
?> 

XMLに変換し、アレイ全体を持ってする最も簡単な方法は何ですか?

答えて

0

オンサイトで問題のデータのためのいくつかの作業例:https://stackoverflow.com/a/14143759/367456

オリジナルの答えは次のとおりです。

は、これらの事前定義された実装を見てみましょう:

http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/

属性のサポートについては、それが特定の方法であなたの配列を作成する必要があります:あなたはまた、XMLに配列を変換するためのサポートを属性したい場合は210

+1

第2リンクが死んでいます。 – markus

+1

最初のリンクは質問に答えず、2番目のリンクはなくなりました。あなたの答えを見直してください。同様の質問に対する回答に追加リンクを追加しました。 – hakre

0

は、あなたがこの実装を使用することができます。属性を持たないXMLでは、関数に配列を直接渡してXMLを得ることができます

0

出力するだけの簡単な関数を作成することができます。たとえば、要素を含む配列を関数に渡し、親要素の名前(ドキュメントのルート要素)と各要素の名前を伝えます。

親の場合はcolors、各要素の場合はと仮定します。ただ、すべての要素を反復処理、

function xml_from_indexed_array($array, $parent, $name) { 

    echo '<?xml version="1.0"?>', "\n"; 
    echo "<$parent>\n"; 
    foreach ($array as $element) { 
     echo " <$name>\n"; 
     foreach ($element as $child => $value) { 
      echo " <$child>$value</$child>\n"; 
     } 
     echo " </$name>\n"; 
    } 
    echo "</$parent>\n"; 
} 

あなたが見ることができるように、これはかなり単純です:

私も名前のキーがcolor要素の子であると仮定しました。

使用例:

<?php 
$colors = array(); 

$colors[0]['id'] = 1; 
$colors[0]['color'] = 'blue'; 

$colors[1]['id'] = 2; 
$colors[1]['color'] = 'green'; 

xml_from_indexed_array($colors, 'colors', 'color'); 

出力例:

<?xml version="1.0"?> 
<colors> 
    <color> 
    <id>1</id> 
    <color>blue</color> 
    </color> 
    <color> 
    <id>2</id> 
    <color>green</color> 
    </color> 
</colors> 

あなたがより深くネストされ、より高度な配列構造を持っている場合は、再帰的にこの問題を解決することがあります。いくつかの関連質問:

0

それがこれを行うには私に多くの時間を要しました。私は本当にPHPがあなたのためにこれを行う機能を持っていないと信じられない。とにかく、これは誰かに役立つことを願っています。楽しい!

<?php 
class Xml 
{ 
    public function getXmlFromArray($value, \SimpleXMLElement &$xmlElement, $entity, $starting = null) 
{ 

    $handleValue = function($value){ 
     $entityHandler = $this->getEntityHandler(); 
     if($entityHandler && $entityHandler instanceof \Closure){ 
      $value = $entityHandler($value); 
     } 
     if(is_string($value)){ 
      $value = htmlspecialchars($value); 
     } 
     return $value; 
    }; 
    $addChild = function($name, $value, &$subNode = null)use(&$xmlElement, $handleValue, $entity){ 
     if(is_array($value)){ 
      if(!$subNode instanceof \SimpleXMLElement){ 
       $currentKey = key($value); 
       $initialValue = null; 
       if(is_numeric($currentKey)){ 
        if(!is_array($value[$currentKey])){ 
         $initialValue = $value[$currentKey]; 
         unset($value[$currentKey]); 
        } 
       } 
       $subNode = $xmlElement->addChild($this->cleanXmlTagName($name), $initialValue); 
      } 
      $this->getXmlFromArray($handleValue($value), $subNode, $name); 
     } else { 
      $xmlElement->addChild($this->cleanXmlTagName($name), $handleValue($value)); 
     } 
    }; 

    if(is_array($value)) 
    { 
     if(is_numeric(key($value))){ 
      $setSubNodePrimitiveValue = function($value)use(&$xmlElement, $entity, $handleValue){ 
       $value = $handleValue($value); 
       $children = $xmlElement->children(); 
       $children[] = $value; 
      }; 
      foreach ($value as $item) 
      { 
       if(!is_array($item)){ 
        $setSubNodePrimitiveValue($item); 
       } else { 
        if($starting === true){ 
         $addChild($entity, $item); 
        } else { 
         $addChild($entity, $item, $xmlElement); 
        } 
       } 
      } 
     } else { 
      foreach ($value as $subEntity => $subEntityItem) 
      { 
       if(is_array($subEntityItem) && is_array(current($subEntityItem)) && is_numeric(key($subEntityItem))){ 
        $this->getXmlFromArray($subEntityItem, $xmlElement, $subEntity, true); 
        continue; 
       } 
       $addChild($subEntity, $subEntityItem); 
      } 
     } 
    } else { 
     $xmlElement->addChild($this->cleanXmlTagName($entity), $handleValue($value)); 
    } 
} 

public function cleanXmlTagName(string $tagName) 
{ 
    if(is_numeric($tagName[0])){ 
     $tagName = '_'.$tagName; 
    } 
    return preg_replace('/[^A-Za-z0-9.\-_]/', '_', $tagName); 
} 

    /** 
    * @param array $array 
    * @param string $openingTag 
    * @param string $entity 
    * @param string $nameSpace 
    * @param bool $isPrefixed 
    * @return \SimpleXMLElement 
    */ 
    public function generateXmlFromArray(array $array, string $openingTag, string $entity, $nameSpace = '', $isPrefixed = false) 
    { 
     $xmlString = '<'.$openingTag.'></'.$openingTag.'>'; 
     $xml = new \SimpleXMLElement($xmlString, LIBXML_NOERROR, false, $nameSpace, $isPrefixed); 
     $this->getXmlFromArray($array, $xml, $entity, true); 
     return $xml; 
    } 

    /** 
    * @param string $xml 
    * @return bool 
    */ 
    public function validateXml(string $xml) 
    { 
     $dom = new \DOMDocument(); 
     $dom->loadXML($xml); 
     return $dom->validate(); 
    } 

    public function loadXmlPathAsArray(string $xmlPath) 
    { 
     $xml = simplexml_load_file($xmlPath); 
     $array = json_decode(json_encode($xml), TRUE); 
     return (array)$array; 
    } 

    /** 
    * @param string $xmlString 
    * @return array 
    */ 
    public function loadXmlStringAsArray(string $xmlString) 
    { 
     $array = (array) @simplexml_load_string($xmlString); 
     if(!$array){ 
      $array = (array) @json_decode($xmlString, true); 
     } else{ 
      $array = (array)@json_decode(json_encode($array), true); 
     } 
     return $array; 
    } 

    /** 
    * @param string $xmlString 
    * @return \SimpleXMLElement 
    */ 
    public function loadXmlString(string $xmlString) 
    { 
     return @simplexml_load_string($xmlString); 
    } 
} 
+0

あなたはそれを$ xml = new Xml()で呼び出します。$ xml-> generateXmlFromArray($配列、 'エンティティ'、 'エンティティ'); – kurtbr

関連する問題