は、私はこのような配列を持っていると言う:PHP配列をXMLに変換していますか?
<?php
$colors=array();
$colors[0]['id']=1;
$colors[0]['color']='blue';
$colors[1]['id']=2;
$colors[1]['color']='green';
......
?>
XMLに変換し、アレイ全体を持ってする最も簡単な方法は何ですか?
は、私はこのような配列を持っていると言う:PHP配列をXMLに変換していますか?
<?php
$colors=array();
$colors[0]['id']=1;
$colors[0]['color']='blue';
$colors[1]['id']=2;
$colors[1]['color']='green';
......
?>
XMLに変換し、アレイ全体を持ってする最も簡単な方法は何ですか?
オンサイトで問題のデータのためのいくつかの作業例: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
は、あなたがこの実装を使用することができます。属性を持たないXMLでは、関数に配列を直接渡してXMLを得ることができます
出力するだけの簡単な関数を作成することができます。たとえば、要素を含む配列を関数に渡し、親要素の名前(ドキュメントのルート要素)と各要素の名前を伝えます。
親の場合は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>
あなたがより深くネストされ、より高度な配列構造を持っている場合は、再帰的にこの問題を解決することがあります。いくつかの関連質問:
それがこれを行うには私に多くの時間を要しました。私は本当に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);
}
}
あなたはそれを$ xml = new Xml()で呼び出します。$ xml-> generateXmlFromArray($配列、 'エンティティ'、 'エンティティ'); – kurtbr
第2リンクが死んでいます。 – markus
最初のリンクは質問に答えず、2番目のリンクはなくなりました。あなたの答えを見直してください。同様の質問に対する回答に追加リンクを追加しました。 – hakre