因爲某個需求需要生成xml文件,找了許多例子沒有發現自己想要的,後面整理寫出了這個,記錄下來。
xml轉換成數組:
XmlTransformTools::init()->xmlToArray($txt);
數組轉換成xml:
XmlTransformTools::init()->arrayToXml($array);
class XmlTransformTools
{
private static $init;
private static $domObject;
private $xmlContent = '';
private $arrayList = [];
public $rootName = 'DOCUMENT'; //根節點的名稱
public $cdata = false; //cdata的開關
public static $xmlVersion = '1.0'; //設置版本
public static $xmlEncode = 'utf-8'; //設置字符類型
private function __construct()
{
}
public static function init()
{
if (empty(self::$init)) {
self::$init = new self();
}
return self::$init;
}
public static function domObject()
{
if (empty(self::$domObject)) {
self::$domObject = new \DomDocument(self::$xmlVersion, self::$xmlEncode);
}
return self::$domObject;
}
private function XmlToObject()
{
return $this->arrayList = simplexml_load_string($this->xmlContent, 'SimpleXMLElement', LIBXML_NOCDATA);
}
private function XmlObjectToJsonString()
{
return $this->arrayList = json_encode($this->arrayList);
}
private function jsonToArray()
{
return $this->arrayList = json_decode($this->arrayList, true);
}
/**
* @param string $xmlString
* @return mixed 返回xml解析的數組
*/
public function xmlToArray($xmlString = '')
{
$this->xmlContent = $xmlString;
$this->XmlToObject();
$this->XmlObjectToJsonString();
return $this->jsonToArray();
}
/**
* @param array $array
* @return string 返回xml文本
*/
public function arrayToXml(array $array = [])
{
return $this->xmlCreateByArray($array);
}
private function createNode($node = '', $value = null)
{
return self::domObject()->createElement($node, $value);
}
private function createTextNode(string $text = '')
{
return self::domObject()->createTextNode($text);
}
private function createCDATA(string $CDATA = '')
{
return self::domObject()->createCDATASection($CDATA);
}
private function appendChild(DOMNode $node = null, $childNode = null)
{
return $node->appendChild($childNode);
}
private function xmlCreateByArray(array $array = [])
{
$root = self::domObject()->createElement($this->rootName);
self::domObject()->appendChild($root);
$this->callBackXmlCreate($array, $root);
$rs = self::domObject()->saveXML();
self::domObject()->removeChild($root);
return $rs;
}
/**
* 對轉換設置的回調操作
* @param $array 要轉換的數組
* @param null $pkTmp 上一級node節點對象
* @param string $elementName 針對同名節點設置的創建名稱
*/
private function callBackXmlCreate($array, $pkTmp = null, $elementName = '')
{
$key = '';
foreach ($array as $k => $v)
{
$nodeName = is_numeric($k) ? $elementName : $k;
if (is_array($v)) {
$key = key($v);
}
if (is_numeric($key) || $nodeName === '@attributes') {
$kTmp = $pkTmp;
} else {
$kTmp = $this->createNode($nodeName);
}
if ($nodeName === '@attributes') {
foreach ($v as $kk => $vv) {
$kTmp->setAttribute($kk, $vv);
}
continue;
}
if (!is_array($v)) {
if ($this->cdata) {
$vTmp = $this->createCDATA($v);
} else {
$vTmp = $this->createTextNode($v);
}
$this->appendChild($kTmp, $vTmp);
}
if (!empty($pkTmp) && !is_numeric($key)) {
$this->appendChild($pkTmp, $kTmp);
}
if (is_array($v)) {
if (!is_numeric($k)) {
$elementName = $k;
}
$this->callBackXmlCreate($v, $kTmp, $elementName);
}
}
}
}