|
|
|
@ -10,6 +10,7 @@ namespace yii\web;
|
|
|
|
|
use DOMDocument; |
|
|
|
|
use DOMElement; |
|
|
|
|
use DOMText; |
|
|
|
|
use DOMException; |
|
|
|
|
use yii\base\Arrayable; |
|
|
|
|
use yii\base\Component; |
|
|
|
|
use yii\helpers\StringHelper; |
|
|
|
@ -94,11 +95,11 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa
|
|
|
|
|
if (is_int($name) && is_object($value)) { |
|
|
|
|
$this->buildXml($element, $value); |
|
|
|
|
} elseif (is_array($value) || is_object($value)) { |
|
|
|
|
$child = new DOMElement(is_int($name) ? $this->itemTag : $name); |
|
|
|
|
$child = new DOMElement($this->getValidXmlElementName($name)); |
|
|
|
|
$element->appendChild($child); |
|
|
|
|
$this->buildXml($child, $value); |
|
|
|
|
} else { |
|
|
|
|
$child = new DOMElement(is_int($name) ? $this->itemTag : $name); |
|
|
|
|
$child = new DOMElement($this->getValidXmlElementName($name)); |
|
|
|
|
$element->appendChild($child); |
|
|
|
|
$child->appendChild(new DOMText($this->formatScalarValue($value))); |
|
|
|
|
} |
|
|
|
@ -143,4 +144,39 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa
|
|
|
|
|
|
|
|
|
|
return (string) $value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Returns element name ready to be used in DOMElement if |
|
|
|
|
* name is not empty, is not int and is valid. |
|
|
|
|
* |
|
|
|
|
* Falls back to [[itemTag]] otherwise. |
|
|
|
|
* |
|
|
|
|
* @param mixed $name |
|
|
|
|
* @return string |
|
|
|
|
* @since 2.0.12 |
|
|
|
|
*/ |
|
|
|
|
protected function getValidXmlElementName($name) |
|
|
|
|
{ |
|
|
|
|
if (empty($name) || is_int($name) || !$this->isValidXmlName($name)) { |
|
|
|
|
return $this->itemTag; |
|
|
|
|
} |
|
|
|
|
return $name; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Checks if name is valid to be used in XML |
|
|
|
|
* |
|
|
|
|
* @param mixed $name |
|
|
|
|
* @return bool |
|
|
|
|
* @see http://stackoverflow.com/questions/2519845/how-to-check-if-string-is-a-valid-xml-element-name/2519943#2519943 |
|
|
|
|
*/ |
|
|
|
|
protected function isValidXmlName($name) |
|
|
|
|
{ |
|
|
|
|
try { |
|
|
|
|
new DOMElement($name); |
|
|
|
|
return true; |
|
|
|
|
} catch (DOMException $e) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|