使用Symfony Serialiser创建XML时,如何控制标记顺序?

使用Symfony Serialiser创建XML时,如何控制标记顺序?,symfony,xmlserializer,serialization,Symfony,Xmlserializer,Serialization,我有下面的测试用例,但我发现XML部分并没有按照我要求的顺序出现。我使用的SOAP API发出了以下消息: <Search Type="Error"> <ErrorCode>150</ErrorCode> <ErrorMessage>Invalid Entry : Invalid content was found starting with element &apos;Telephones&apos;. One o

我有下面的测试用例,但我发现XML部分并没有按照我要求的顺序出现。我使用的SOAP API发出了以下消息:

<Search Type="Error">
    <ErrorCode>150</ErrorCode>
    <ErrorMessage>Invalid Entry : Invalid content was found starting with element &apos;Telephones&apos;. One of &apos;{Addresses}&apos; is expected. </ErrorMessage>
</Search 

150
无效条目:发现以元素&apos;开头的无效内容;电话;。其中一个&apos;{地址}&apos;这是意料之中的事。
setRootNodeName(“联系人”);
$encoders=array($xmlcoder,新的JsonEncoder());
$normalizers=array(新的ObjectNormalizer(),新的arraydennormalizer());
$serializer=新的序列化程序($normalizers,$encoders);
//XmlEncode的默认根标记为。不是我们想要的,所以我们把它改成
$xmlEncoder=新的xmlEncoder();
$xmlEncoder->setRootNodeName('Contact');
$encoders=array($xmlcoder,新的JsonEncoder());
$normalizers=array(新的ObjectNormalizer(),新的arraydennormalizer());
$serializer=新的序列化程序($normalizers,$encoders);
//我们可以从php数据结构到xml的第一个测试
$address=新地址();
$address->setPremise('11')
->设置邮政编码('ZZ99 9ZZ');
$contact=新联系人();
$contact->setName('baa')
->地址编号('9876543210')
->地址编号('9876543212')
->setAddress($address);
$xmlContent=$serializer->serialize($contact,'xml');
回声“;
回音htmlentities($xmlContent);
回声“

”; //接下来让我们测试一下从xml到php的转换 $data=addNumber('01234567890'); $xmlContent=$serializer->serialize($contact,'xml'); 回声“; 回音htmlentities($xmlContent); 回声“; ?>
输出:

<Contact>
    <Name>baa</Name>
    <Numbers>
        <Number>9876543210</Number>
        <Number>9876543212</Number>
    </Numbers>
    <Address>
        <Premise>11</Premise>
        <Postcode>ZZ99 9ZZ</Postcode>
    </Address>
</Contact>

<?xml version="1.0"?>
<Contact>
    <Name>foo</Name>
    <Numbers>
        <Number>02378415326</Number>
        <Number>07865412354</Number>
        <Number>01234567890</Number>
    </Numbers>
    <Address>
        <Premise>12</Premise>
        <Postcode>YY88 8YY</Postcode>
    </Address>
</Contact>

咩
9876543210
9876543212
11
ZZ99 9ZZ
福
02378415326
07865412354
01234567890
12
YY88 8YY
又快又脏:

您只需更改
联系人
类中属性和/或getter方法的顺序(取决于属性访问器类型)


现在清除序列化程序和/或opcache缓存,并享受XML输出中更改的顺序。

。。或者扩展/覆盖
ObjectNormalizer
来回答您的问题,在这里您将以正确的方式强制执行订单。还有其他干净的方式吗?
<Contact>
    <Name>baa</Name>
    <Numbers>
        <Number>9876543210</Number>
        <Number>9876543212</Number>
    </Numbers>
    <Address>
        <Premise>11</Premise>
        <Postcode>ZZ99 9ZZ</Postcode>
    </Address>
</Contact>

<?xml version="1.0"?>
<Contact>
    <Name>foo</Name>
    <Numbers>
        <Number>02378415326</Number>
        <Number>07865412354</Number>
        <Number>01234567890</Number>
    </Numbers>
    <Address>
        <Premise>12</Premise>
        <Postcode>YY88 8YY</Postcode>
    </Address>
</Contact>