95 public static function recXmlPrint( $name, $value, $indent, $attributes = [] ) {
97 if ( $indent !==
null ) {
98 if ( $name !==
null ) {
101 $indstr =
"\n" . str_repeat(
' ', $indent );
106 if ( is_object( $value ) ) {
107 $value = (array)$value;
109 if ( is_array( $value ) ) {
110 $contentKey = $value[ApiResult::META_CONTENT] ??
'*';
111 $subelementKeys = $value[ApiResult::META_SUBELEMENTS] ?? [];
112 if ( isset( $value[ApiResult::META_BC_SUBELEMENTS] ) ) {
113 $subelementKeys = array_merge(
114 $subelementKeys, $value[ApiResult::META_BC_SUBELEMENTS]
117 $preserveKeys = $value[ApiResult::META_PRESERVE_KEYS] ?? [];
118 $indexedTagName = isset( $value[ApiResult::META_INDEXED_TAG_NAME] )
119 ? self::mangleName( $value[ApiResult::META_INDEXED_TAG_NAME], $preserveKeys )
121 $bcBools = $value[ApiResult::META_BC_BOOLS] ?? [];
122 $indexSubelements = isset( $value[ApiResult::META_TYPE] )
123 && $value[ApiResult::META_TYPE] !==
'array';
127 $indexedSubelements = [];
128 foreach ( $value as $k => $v ) {
129 if ( ApiResult::isMetadataKey( $k ) && !in_array( $k, $preserveKeys,
true ) ) {
134 if ( is_bool( $v ) && !in_array( $k, $bcBools,
true ) ) {
135 $v = $v ?
'true' :
'false';
138 if ( $name !==
null && $k === $contentKey ) {
140 } elseif ( is_int( $k ) ) {
141 $indexedSubelements[$k] = $v;
142 } elseif ( is_array( $v ) || is_object( $v ) ) {
143 $subelements[self::mangleName( $k, $preserveKeys )] = $v;
144 } elseif ( in_array( $k, $subelementKeys,
true ) || $name ===
null ) {
145 $subelements[self::mangleName( $k, $preserveKeys )] = [
147 ApiResult::META_CONTENT =>
'content',
148 ApiResult::META_TYPE =>
'assoc',
150 } elseif ( is_bool( $oldv ) ) {
152 $attributes[self::mangleName( $k, $preserveKeys )] =
'';
154 } elseif ( $v !==
null ) {
155 $attributes[self::mangleName( $k, $preserveKeys )] = $v;
159 if ( $content !==
null ) {
160 if ( $subelements || $indexedSubelements ) {
161 $subelements[self::mangleName( $contentKey, $preserveKeys )] = [
162 'content' => $content,
163 ApiResult::META_CONTENT =>
'content',
164 ApiResult::META_TYPE =>
'assoc',
167 } elseif ( is_scalar( $content ) ) {
170 $attributes += [
'xml:space' =>
'preserve' ];
174 if ( $content !==
null ) {
175 if ( is_scalar( $content ) ) {
177 $retval .= $indstr . Xml::element( $name, $attributes, $content );
179 if ( $name !==
null ) {
180 $retval .= $indstr . Xml::element( $name, $attributes,
null );
182 $retval .= static::recXmlPrint(
null, $content, $indent );
183 if ( $name !==
null ) {
184 $retval .= $indstr . Xml::closeElement( $name );
187 } elseif ( !$indexedSubelements && !$subelements ) {
188 if ( $name !==
null ) {
189 $retval .= $indstr . Xml::element( $name, $attributes );
192 if ( $name !==
null ) {
193 $retval .= $indstr . Xml::element( $name, $attributes,
null );
195 foreach ( $subelements as $k => $v ) {
196 $retval .= static::recXmlPrint( $k, $v, $indent );
198 foreach ( $indexedSubelements as $k => $v ) {
199 $retval .= static::recXmlPrint( $indexedTagName, $v, $indent,
200 $indexSubelements ? [
'_idx' => $k ] : []
203 if ( $name !==
null ) {
204 $retval .= $indstr . Xml::closeElement( $name );
210 if ( $value ===
null ) {
212 $retval .= $indstr . Xml::element( $name, $attributes );
215 $retval .= $indstr . Xml::element( $name, $attributes, $value );