1+ <?php
2+ /**
3+ * @link http://www.yiiframework.com/
4+ * @copyright Copyright (c) 2008 Yii Software LLC
5+ * @license http://www.yiiframework.com/license/
6+ */
7+
8+ namespace yii \httpclient ;
9+
10+ use DOMDocument ;
11+ use DOMElement ;
12+ use DOMText ;
13+ use SimpleXMLElement ;
14+ use yii \base \Arrayable ;
15+ use yii \base \Object ;
16+ use Yii ;
17+ use yii \helpers \StringHelper ;
18+
19+ /**
20+ * FormatterXml formats HTTP message as XML.
21+ *
22+ * @author Paul Klimov <klimov.paul@gmail.com>
23+ * @since 2.0
24+ */
25+ class FormatterXml extends Object implements FormatterInterface
26+ {
27+ /**
28+ * @var string the Content-Type header for the response
29+ */
30+ public $ contentType = 'application/xml ' ;
31+ /**
32+ * @var string the XML version
33+ */
34+ public $ version = '1.0 ' ;
35+ /**
36+ * @var string the XML encoding. If not set, it will use the value of [[\yii\base\Application::charset]].
37+ */
38+ public $ encoding ;
39+ /**
40+ * @var string the name of the root element.
41+ */
42+ public $ rootTag = 'request ' ;
43+
44+
45+ /**
46+ * @inheritdoc
47+ */
48+ public function format (Request $ request )
49+ {
50+ $ contentType = $ this ->contentType ;
51+ $ charset = $ this ->encoding === null ? Yii::$ app ->charset : $ this ->encoding ;
52+ if (stripos ($ contentType , 'charset ' ) === false ) {
53+ $ contentType .= '; charset= ' . $ charset ;
54+ }
55+ $ request ->getHeaders ()->set ('Content-Type ' , $ contentType );
56+
57+ $ data = $ request ->getData ();
58+ if ($ data !== null ) {
59+ if ($ data instanceof DOMDocument) {
60+ $ content = $ data ->saveXML ();
61+ } elseif ($ data instanceof SimpleXMLElement) {
62+ $ content = $ data ->saveXML ();
63+ } else {
64+ $ dom = new DOMDocument ($ this ->version , $ charset );
65+ $ root = new DOMElement ($ this ->rootTag );
66+ $ dom ->appendChild ($ root );
67+ $ this ->buildXml ($ root , $ data );
68+ $ content = $ dom ->saveXML ();
69+ }
70+ $ request ->setContent ($ content );
71+ }
72+
73+ return $ request ;
74+ }
75+
76+ /**
77+ * @param DOMElement $element
78+ * @param mixed $data
79+ */
80+ protected function buildXml ($ element , $ data )
81+ {
82+ if (is_object ($ data )) {
83+ $ child = new DOMElement (StringHelper::basename (get_class ($ data )));
84+ $ element ->appendChild ($ child );
85+ if ($ data instanceof Arrayable) {
86+ $ this ->buildXml ($ child , $ data ->toArray ());
87+ } else {
88+ $ array = [];
89+ foreach ($ data as $ name => $ value ) {
90+ $ array [$ name ] = $ value ;
91+ }
92+ $ this ->buildXml ($ child , $ array );
93+ }
94+ } elseif (is_array ($ data )) {
95+ foreach ($ data as $ name => $ value ) {
96+ if (is_int ($ name ) && is_object ($ value )) {
97+ $ this ->buildXml ($ element , $ value );
98+ } elseif (is_array ($ value ) || is_object ($ value )) {
99+ $ child = new DOMElement (is_int ($ name ) ? $ this ->itemTag : $ name );
100+ $ element ->appendChild ($ child );
101+ $ this ->buildXml ($ child , $ value );
102+ } else {
103+ $ child = new DOMElement (is_int ($ name ) ? $ this ->itemTag : $ name );
104+ $ element ->appendChild ($ child );
105+ $ child ->appendChild (new DOMText ((string ) $ value ));
106+ }
107+ }
108+ } else {
109+ $ element ->appendChild (new DOMText ((string ) $ data ));
110+ }
111+ }
112+ }
0 commit comments