96 public static function recXmlPrint( $name, $value, $indent, $attributes = [] ) {
98 if ( $indent !==
null ) {
99 if ( $name !==
null ) {
102 $indstr =
"\n" . str_repeat(
' ', $indent );
107 if ( is_object( $value ) ) {
108 $value = (array)$value;
110 if ( is_array( $value ) ) {
111 $contentKey = $value[ApiResult::META_CONTENT] ??
'*';
112 $subelementKeys = $value[ApiResult::META_SUBELEMENTS] ?? [];
113 if ( isset( $value[ApiResult::META_BC_SUBELEMENTS] ) ) {
114 $subelementKeys = array_merge(
115 $subelementKeys, $value[ApiResult::META_BC_SUBELEMENTS]
118 $preserveKeys = $value[ApiResult::META_PRESERVE_KEYS] ?? [];
119 $indexedTagName = isset( $value[ApiResult::META_INDEXED_TAG_NAME] )
120 ? self::mangleName( $value[ApiResult::META_INDEXED_TAG_NAME], $preserveKeys )
122 $bcBools = $value[ApiResult::META_BC_BOOLS] ?? [];
123 $indexSubelements = isset( $value[ApiResult::META_TYPE] )
124 && $value[ApiResult::META_TYPE] !==
'array';
128 $indexedSubelements = [];
129 foreach ( $value as $k => $v ) {
130 if ( ApiResult::isMetadataKey( $k ) && !in_array( $k, $preserveKeys,
true ) ) {
135 if ( is_bool( $v ) && !in_array( $k, $bcBools,
true ) ) {
136 $v = $v ?
'true' :
'false';
139 if ( $name !==
null && $k === $contentKey ) {
141 } elseif ( is_int( $k ) ) {
142 $indexedSubelements[$k] = $v;
143 } elseif ( is_array( $v ) || is_object( $v ) ) {
144 $subelements[self::mangleName( $k, $preserveKeys )] = $v;
145 } elseif ( in_array( $k, $subelementKeys,
true ) || $name ===
null ) {
146 $subelements[self::mangleName( $k, $preserveKeys )] = [
148 ApiResult::META_CONTENT =>
'content',
149 ApiResult::META_TYPE =>
'assoc',
151 } elseif ( is_bool( $oldv ) ) {
153 $attributes[self::mangleName( $k, $preserveKeys )] =
'';
155 } elseif ( $v !==
null ) {
156 $attributes[self::mangleName( $k, $preserveKeys )] = $v;
160 if ( $content !==
null ) {
161 if ( $subelements || $indexedSubelements ) {
162 $subelements[self::mangleName( $contentKey, $preserveKeys )] = [
163 'content' => $content,
164 ApiResult::META_CONTENT =>
'content',
165 ApiResult::META_TYPE =>
'assoc',
168 } elseif ( is_scalar( $content ) ) {
171 $attributes += [
'xml:space' =>
'preserve' ];
175 if ( $content !==
null ) {
176 if ( is_scalar( $content ) ) {
178 $retval .= $indstr . Xml::element( $name, $attributes, $content );
180 if ( $name !==
null ) {
181 $retval .= $indstr . Xml::element( $name, $attributes,
null );
183 $retval .= static::recXmlPrint(
null, $content, $indent );
184 if ( $name !==
null ) {
185 $retval .= $indstr . Xml::closeElement( $name );
188 } elseif ( !$indexedSubelements && !$subelements ) {
189 if ( $name !==
null ) {
190 $retval .= $indstr . Xml::element( $name, $attributes );
193 if ( $name !==
null ) {
194 $retval .= $indstr . Xml::element( $name, $attributes,
null );
196 foreach ( $subelements as $k => $v ) {
197 $retval .= static::recXmlPrint( $k, $v, $indent );
199 foreach ( $indexedSubelements as $k => $v ) {
200 $retval .= static::recXmlPrint( $indexedTagName, $v, $indent,
201 $indexSubelements ? [
'_idx' => $k ] : []
204 if ( $name !==
null ) {
205 $retval .= $indstr . Xml::closeElement( $name );
211 if ( $value ===
null ) {
213 $retval .= $indstr . Xml::element( $name, $attributes );
216 $retval .= $indstr . Xml::element( $name, $attributes, $value );