配列を作成し、0..n 要素を配列内のサブ配列の 1 つにプッシュします (以下のコードで意味を理解するのが最も簡単です)。
XML_Serializer を介して配列を実行すると、プッシュされた要素の周りに余分なタグが追加されます
$serializer_options = array(
XML_SERIALIZER_OPTION_INDENT => ' ',
XML_SERIALIZER_OPTION_RETURN_RESULT => TRUE,
rootName => 'JZ_2103'
);
$serializer = &new XML_Serializer($serializer_options);
$otXmlArr = array(
'status' => 'success',
'reason' => 'null',
'payload' => array(
'ContactsResponse' => array()
)
);
foreach ($mydata as $item) {
array_push($otXmlArr['payload']['ContactsResponse'],
array(
'Contact' => array(
'ID' => $item['id'],
'FirstName' => $item['fname']
)
)
);
}
$otXml = $serializer->serialize($otXmlArr);
作成される xml には余分なタグがあります<XML_Serializer_Tag>
。これらのタグを削除するにはどうすればよいですか?
<JZ_2103>
<status>success</status>
<reason>null</reason>
<payload>
<ContactsResponse>
<XML_Serializer_Tag>
<Contact>
<ID>10</ID>
<FirstName>Roy</FirstName>
</Contact>
</XML_Serializer_Tag>
</ContactsResponse>
</payload>
</JZ_2103>
Abstr のソリューションはほぼ機能します。結果は次のとおりです。
配列のprint_rから:
Array
(
[status] => success
[reason] => null
[payload] => Array
(
[ContactsResponse] => Array
(
[0] => Array
(
[Contact] => Array
(
[ID] => 3
[FirstName] => Joe
)
)
[1] => Array
(
[Contact] => Array
(
[ID] => 4
[FirstName] => Fred
)
)
)
)
)
シリアル化された XML:
<JZ_2103>
<status>success</status>
<reason>null</reason>
<payload>
<ContactsResponse>
<Contact>
<ID>3</ID>
<FirstName>Joe</FirstName>
</Contact>
</ContactsResponse>
<ContactsResponse>
<Contact>
<ID>4</ID>
<FirstName>Fred</FirstName>
</Contact>
</ContactsResponse>
</payload>
</JZ_2103>
Daniel の提案を使用すると、XML 出力は次のようになります。Extra level of nesting :-(
<JZ_2103>
<status>success</status>
<reason>null</reason>
<payload>
<ContactsResponse>
<Contact>
<Contact>
<ID>3</ID>
<FirstName>Joe</FirstName>
</Contact>
</Contact>
<Contact>
<Contact>
<ID>4</ID>
<FirstName>Fred</FirstName>
</Contact>
</Contact>
</ContactsResponse>
</payload>
</JZ_2103>
シリアライザーの使用をあきらめて、simpleXml を使用して直接 xml をビルドするだけだと思います。これはすべて、時間を節約するための試みとして始まりましたが、明らかにそうではありません!
Daniel と Abstr の助けに感謝します。