123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\Xml;
- class Generator
- {
- /**
- * This value is used to replace numeric keys while formatting data for xml output.
- */
- const DEFAULT_ENTITY_ITEM_NAME = 'item';
- /**
- * @var \DOMDocument|null
- */
- protected $_dom = null;
- /**
- * @var \DOMDocument
- */
- protected $_currentDom;
- /**
- * @var string
- */
- protected $_defaultIndexedArrayItemName;
- /**
- *
- */
- public function __construct()
- {
- $this->_dom = new \DOMDocument('1.0');
- $this->_dom->formatOutput = true;
- $this->_currentDom = $this->_dom;
- return $this;
- }
- /**
- * @return \DOMDocument|null
- */
- public function getDom()
- {
- return $this->_dom;
- }
- /**
- * @return \DOMDocument
- */
- protected function _getCurrentDom()
- {
- return $this->_currentDom;
- }
- /**
- * @param \DOMDocument $node
- * @return $this
- */
- protected function _setCurrentDom($node)
- {
- $this->_currentDom = $node;
- return $this;
- }
- /**
- * @param array $content
- * @return $this
- * @throws \DOMException
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- public function arrayToXml($content)
- {
- $parentNode = $this->_getCurrentDom();
- if (!$content || !count($content)) {
- return $this;
- }
- foreach ($content as $_key => $_item) {
- $node = $this->getDom()->createElement(preg_replace('/[^\w-]/i', '', $_key));
- $parentNode->appendChild($node);
- if (is_array($_item) && isset($_item['_attribute'])) {
- if (is_array($_item['_value'])) {
- if (isset($_item['_value'][0])) {
- foreach ($_item['_value'] as $_v) {
- $this->_setCurrentDom($node)->arrayToXml($_v);
- }
- } else {
- $this->_setCurrentDom($node)->arrayToXml($_item['_value']);
- }
- } else {
- $child = $this->getDom()->createTextNode($_item['_value']);
- $node->appendChild($child);
- }
- foreach ($_item['_attribute'] as $_attributeKey => $_attributeValue) {
- $node->setAttribute($_attributeKey, $_attributeValue);
- }
- } elseif (is_string($_item)) {
- $text = $this->getDom()->createTextNode($_item);
- $node->appendChild($text);
- } elseif (is_array($_item) && !isset($_item[0])) {
- $this->_setCurrentDom($node)->arrayToXml($_item);
- } elseif (is_array($_item) && isset($_item[0])) {
- foreach ($_item as $v) {
- $this->_setCurrentDom($node)->arrayToXml([$this->_getIndexedArrayItemName() => $v]);
- }
- }
- }
- return $this;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- return $this->getDom()->saveXML();
- }
- /**
- * @param string $file
- * @return $this
- */
- public function save($file)
- {
- $this->getDom()->save($file);
- return $this;
- }
- /**
- * Set xml node name to use instead of numeric index during numeric arrays conversion.
- *
- * @param string $name
- * @return $this
- */
- public function setIndexedArrayItemName($name)
- {
- $this->_defaultIndexedArrayItemName = $name;
- return $this;
- }
- /**
- * Get xml node name to use instead of numeric index during numeric arrays conversion.
- *
- * @return string
- */
- protected function _getIndexedArrayItemName()
- {
- return $this->_defaultIndexedArrayItemName ?? self::DEFAULT_ENTITY_ITEM_NAME;
- }
- }
|