3

配列を作成し、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 の助けに感謝します。

4

4 に答える 4

3

Adding 'mode' => 'simplexml' to $serializer_options should to it:

$serializer_options = array(
    XML_SERIALIZER_OPTION_INDENT => '    ',
    XML_SERIALIZER_OPTION_RETURN_RESULT => TRUE,
    'rootName' => 'JZ_2103',
    'mode' => 'simplexml', 
);

Or using constants,

$serializer_options = array(
    XML_SERIALIZER_OPTION_INDENT => '    ',
    XML_SERIALIZER_OPTION_RETURN_RESULT => TRUE,
    XML_SERIALIZER_OPTION_ROOT_NAME => 'JZ_2103',
    XML_SERIALIZER_OPTION_MODE => XML_SERIALIZER_MODE_SIMPLEXML,
);

Found it here on line 515.

// use XML_SERIALIZER_MODE_SIMPLEXML to use parent name as tagname

// if transforming an indexed array

XML_SERIALIZER_OPTION_MODE => XML_SERIALIZER_MODE_DEFAULT,

EDIT: updated to point to actual XML_Serializer codebase.

Changes should be made to the code as follows (thanks to @danielpsc, see comments):

$otXmlArr = array(
    'status' => 'success',
    'reason' => 'null',
    'payload' => array(
        'ContactsResponse' => array(
            'Contact' => array()
        )
    )
);

foreach ($mydata as $item) {
    array_push($otXmlArr['payload']['ContactsResponse']['Contact'],
        array(
            'ID' => $item['id'],
            'FirstName' => $item['fname']
        )
    );
}

EDIT2: Made changes to code

于 2013-10-08T08:10:31.980 に答える
2
$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 $key => $item) {
    $otXmlArr['payload']['ContactsResponse']['contact_'.$key] = array(
          'ID' => $item['id'],
          'FirstName' => $item['fname']
      );
}

$otXml = $serializer->serialize($otXmlArr);

期待される結果:

<JZ_2103>
    <status>success</status>
    <reason>null</reason>
    <payload>
        <ContactsResponse>
            <Contact_1>
                <ID>3</ID>
                <FirstName>Joe</FirstName>
            </Contact>
            <Contact_2>
                <ID>4</ID>
                <FirstName>Fred</FirstName>
            </Contact>
        </ContactsResponse>
    </payload>
</JZ_2103>

これが結果ではない場合はお知らせください...

于 2013-10-08T00:53:23.663 に答える
0

問題は、あなたの ContactResponses がすべて数値インデックスの配列にあり、XML が数値タグを許可していないことだと思います。配列の場合print_r、次のように表示されます。

Array
(
    [status] => success
    [reason] => null
    [payload] => Array
        (
            [ContactsResponse] => Array
                (
                    [0] => Array  <---- ** The Problem **
                        (
                            [Contact] => Array
                                (
                                    [ID] => 1
                                    [FirstName] => daniel
                                )

                        ) ... etc ...

そのため、XML_Serializer はこれらの数値タグに有効な値を与える必要があります。デフォルトでは、 を使用することを選択しますXML_Serializer_Tag

「defaultTagName」オプションを使用して、XML_Serializer が匿名タグに使用する名前を選択できるため、必要な結果を得るためにこれを行うことができます。

$serializer_options = array(
    XML_SERIALIZER_OPTION_INDENT => '    ',
    XML_SERIALIZER_OPTION_RETURN_RESULT => TRUE,
    'defaultTagName'=>'Contact',
    '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(
            'ID' => $item['id'],
            'FirstName' => $item['fname']
        )
    );
}

$otXml = $serializer->serialize($otXmlArr);

ここでは、デフォルトのタグ名を Contact に設定し、foreach ループ内の「Contact」ラベルを削除しました。これにより、defaultTagName を取得するタグが作成されます。

編集説明を少し明確にするために編集しました!

于 2013-10-03T12:16:54.313 に答える