PHP - XML响应数组

时间:2016-04-06 16:33:23

标签: php json xml

我正在使用PHP并使用以下XML响应:

<CompressedInventoryResults xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/rpc/Gateway">
<CompressedVehicles>
<F _0="vin" _1="stock" _2="msrp" _3="type" _4="year" _5="make" _6="model" _7="imagelist" _8="stockimage"> 
<RS> 
    <R_ID="9002250">
        <VS>
            <V _0="WA1CMAFP3FA096506" _1="A096506" _2="54305" _3="New" _4="2015" _5="Audi" _6="Q5" _7="http://content.homenetiol.com/640x480/53ef04aa3c46463aaa4fd91b13c00037.jpg|http://content.homenetiol.com/640x480/641d6d0da75d457f9026ba35395afdb2.jpg|http://content.homenetiol.com/640x480/4c42f6ff7c7f44eca4613376afef4b22.jpg|http://content.homenetiol.com/640x480/80327447f3bf4421933ca3cae73f9906.jpg|http://content.homenetiol.com/640x480/df7668c77efc4f9692d7809fcb563c98.jpg|http://content.homenetiol.com/640x480/e253195196374c0884c02660fa860b36.jpg|http://content.homenetiol.com/640x480/cae0afb966cf4f1c8430b8807ef761a2.jpg|http://content.homenetiol.com/640x480/b951eee5230c49a583eb0896bb457795.jpg|http://content.homenetiol.com/640x480/a1521a91be614dc19491549fd97fd482.jpg|http://content.homenetiol.com/640x480/563c00e4b19e45f7aba18277541da4c1.jpg|http://content.homenetiol.com/640x480/f47f11edfbf64d5499b842c8b5076376.jpg|http://content.homenetiol.com/640x480/481eb6fcc7b340628b03978e10c2be17.jpg|http://content.homenetiol.com/640x480/dbf461a4a4f349dbbbf9b5bb0b6a0f36.jpg|http://content.homenetiol.com/640x480/3fafb088370f4ee7bec0a3585ef9cec4.jpg|http://content.homenetiol.com/640x480/10908f2cc9da4d418fa752278f635466.jpg|http://content.homenetiol.com/640x480/bf4c4e649b5b4a9db5eb9113ba2d1918.jpg|http://content.homenetiol.com/640x480/7764048b3b5b478a8cf04fb94edad7a8.jpg|http://content.homenetiol.com/640x480/3685da7d1f224386913033e31ee1ebc1.jpg|http://content.homenetiol.com/640x480/f944ff273af044cd91934aabd7651890.jpg|http://content.homenetiol.com/640x480/d8aed10b7d2f471488a1b3f3f6c084d7.jpg|http://content.homenetiol.com/640x480/00d730f575db4db3958a557747358437.jpg|http://content.homenetiol.com/640x480/f104389450e0403f83eb1fb0ffabe3b3.jpg|http://content.homenetiol.com/640x480/df7a41966f0e42859b63738ecaed163e.jpg|http://content.homenetiol.com/640x480/f7d4638bd43d4a119e54decdd0c1d87d.jpg|http://content.homenetiol.com/640x480/29ea28a68bd9426fb85cfc78fb95bdf3.jpg" _8="" />
            <V _0="WAU3GAFD2FN030313" _1="A030313" _2="92095" _3="New" _4="2015" _5="Audi" _6="A8 L" _7="http://content.homenetiol.com/640x480/b358a6a4b58044689c272f098a82e9e9.jpg|http://content.homenetiol.com/640x480/96ac0951ee5043d998d6028ea173ddb8.jpg|http://content.homenetiol.com/640x480/b6a57c34c3bc40acadb09dd6538d6c55.jpg|http://content.homenetiol.com/640x480/17fcb06ee98b41f39a7d9b147652887f.jpg|http://content.homenetiol.com/640x480/3714a45c044a4ddca5a3b7a98b91cd34.jpg|http://content.homenetiol.com/640x480/a5dbc31621574055bbfb7533f4238c14.jpg|http://content.homenetiol.com/640x480/84a9c569786d44b38a65014c20a82160.jpg|http://content.homenetiol.com/640x480/8796e699b9e0451684e0d53d129148b1.jpg|http://content.homenetiol.com/640x480/7c4e8882b392420ca7dfb0f9e9507ede.jpg|http://content.homenetiol.com/640x480/f0d31c64de7549aab70f54fac7bd1056.jpg|http://content.homenetiol.com/640x480/0b4ba4aed8ff41b28c99cb59cc6a6258.jpg|http://content.homenetiol.com/640x480/185f86b4054e4eb08c80eb153527f81a.jpg|http://content.homenetiol.com/640x480/44d65bb194eb4272af48753c8a60622f.jpg|http://content.homenetiol.com/640x480/5d9ac515c8dc4921bc59a1fd1183e95c.jpg|http://content.homenetiol.com/640x480/85c95ff5be6f4bebb79f00e91ac59bf9.jpg|http://content.homenetiol.com/640x480/6be0af9acbc9426d9f4ac9fee1074230.jpg|http://content.homenetiol.com/640x480/cca6e17551f9432fae6859460291d2b2.jpg|http://content.homenetiol.com/640x480/d659f6fccdbb4da0a8bb7f59e493720f.jpg|http://content.homenetiol.com/640x480/7a16f44689d54010b35fa18ce6f1f6cf.jpg|http://content.homenetiol.com/640x480/fdb808588f3045aa9ec85436f5126deb.jpg|http://content.homenetiol.com/640x480/ccf49db7883e47abb14a56a25f050303.jpg|http://content.homenetiol.com/640x480/612d74e48c9e4709ae11645c4dd1ea9b.jpg|http://content.homenetiol.com/640x480/5d398a9e322548cc90bec6ee39307142.jpg|http://content.homenetiol.com/640x480/fc0951a8d8d64e889094f75b8a1f36f2.jpg|http://content.homenetiol.com/640x480/490085ec3cab412ca1aee24c5a169381.jpg|http://content.homenetiol.com/640x480/df9f24289d984879a6cc496c7a9887a6.jpg|http://content.homenetiol.com/640x480/98c616aefd80431687b367dc0805d1e4.jpg" _8="" />
        </VS>
        </R>
</RS>
</F>
</CompressedVehicles>
<ErrorMessage/>
<InventoryResultType>OK</InventoryResultType>
<IsSuccess>true</IsSuccess>
</CompressedInventoryResults>

如何循环遍历每个CompressedVehicles并将带有“V”占位符的每个条目放入一个数组中,其中“F”条目作为JSON输出的标题?

或者是否有更好的方式与此回复互动?

最终目标是让一个更有用的输出用于与XML无法很好地交互的其他提要,但是接受JSON。

提前致谢。

1 个答案:

答案 0 :(得分:1)

要使用XML文件,您必须使用XML Parser。在这个答案中,您将看到如何使用SimpleXML Parser。要以JSON格式编码数据,您可以使用json_encode函数。

首先,您必须知道自己的XML文件/字符串的具体结构。在<CompressedInventoryResults>下你有这个结构:

<CompressedVehicles>
<F>                     <!-- attributes legend -->
<RS> 
    <R>
        <VS>
            <V />       <!-- vehicle -->
            <V />       <!-- vehicle -->
        </VS>
    </R>
</RS>
</F>
</CompressedVehicles>

然后,在此示例中还有其他系统节点无用:<ErrorMessage/>...

基本上,使用SimpleXML转换JSON格式的XML可能是一项非常简单的任务:

$xml  = simplexml_load_string( $xmlString );
$json = json_encode( $xml );

通过这种简单的方法,您可以在$json变量中获得如下的JSON字符串:

{
    "CompressedVehicles": {
        "F": {
            "@attributes": { ... },
            "RS": {
                "R": {
                    "@attributes": { "_ID": "9002250" },
                    "VS": {
                        "V": [
                            {
                                "@attributes": { ... }
                            },
                            {
                                "@attributes": { ... }
                            }
                        ]
                    }
                }
            }
        }
    },
    "ErrorMessage": {},
    "InventoryResultType": "OK",
    "IsSuccess": "true"
}

pastebin complete JSON

重新解码:

$data = json_decode( $json );

您可以使用标准的php语法为对象和数组添加/修改/删除/打印各种元素。

所以,即遵循以下两行:

echo $data->CompressedVehicles->F->{'@attributes'}->_0) . PHP_EOL;
echo $data->CompressedVehicles->F->{'@attributes'}->_1) . PHP_EOL;

将输出:

vin
stock

否则,如果您想要访问车辆数据,可以通过foreach循环来实现:

foreach( $data->CompressedVehicles->F->RS->R->VS->V as $vehicle )
{
    echo $vehicle->{'@attributes'}->_0 . PHP_EOL;
    echo $vehicle->{'@attributes'}->_1 . PHP_EOL;
}

输出:

WA1CMAFP3FA096506
A096506
WAU3GAFD2FN030313
A030313

使用SimpleXML

创建自定义JSON

一个(位)更复杂的操作可以是获得你想要的JSON,特别是由于使用编码属性的奇怪的XML结构。

加载XML字符串后:

$xml = simplexml_load_string( $xmlString );

您可以在XML结构中导航。 SimpleXML语法与php StdObject语法非常相似:要选择必须使用的节点级别->nodeName;要以同一级别访问单个节点,您可以使用数组语法(->nodeName[0]);要访问特定的属性节点,您可以使用数组语法(->nodeName[0]['attributeName'])。

因此,选择<CompressedVehicles>节点及其所有子节点:

$CompressedVehicles = $xml->CompressedVehicles;

以XML格式回显节点:

echo $CompressedVehicles->F->RS->R->VS->V[0]->asXML();
#                                         ↑ only first vehicle

输出:

<V _0="WA1CMAFP3FA096506" _1="A096506" _2="54305" _3="New" ... />

如前所述,您必须为<F>节点中列出的属性创建图例:

<F _0="vin" _1="stock" _2="msrp" _3="type" _4="year" _5="make" _6="model" _7="imagelist" _8="stockimage"> 

为此,您可以填充迭代<F>节点属性的数组:

$attributes = array();
foreach( $CompressedVehicles->F->attributes() as $key => $val )
{
    $attributes[$key] = $val->__toString();
}

现在,在$attributes数组中,你有这个:

Array
(
    [_0] => vin
    [_1] => stock
    [_2] => msrp
    [_3] => type
    [_4] => year
    [_5] => make
    [_6] => model
    [_7] => imagelist
    [_8] => stockimage
)

现在是启动主阵列的时刻:

$data = array();

然后,您可以在所有foreach个节点中执行<V>循环,并使用$attributes中的键填充子数组:

foreach( $CompressedVehicles->F->RS->R->VS->V as $vehicle )
{
    $line = array();
    foreach( $vehicle->attributes() as $key => $val )
    {
        $line[$attributes[$key]] = $val->__toString();
    }

在您了解它的同时,为什么不爆炸图像元素?

    $line['imagelist'] = explode( '|', $line['imagelist'] );

此时,您可以将子数组添加到主数组:

    $data[] = $line;
}

您可以注意->__toString()语法将SIMPLEXMLElement对象强制转换为字符串。

现在,在你的$data中,你有这个:

Array
(
    [0] => Array
        (
            [vin] => WA1CMAFP3FA096506
            [stock] => A096506
            [msrp] => 54305
            [type] => New
            [year] => 2015
            [make] => Audi
            [model] => Q5
            [imagelist] => Array ( ... )
            [stockimage] => 
        )
    [1] => Array ( ... )
)

pastebin complete array structure

您可以使用JSON字符串格式对其进行编码:

$json = json_encode( $data );

$json包含(美化):

[
    {
        "vin": "WA1CMAFP3FA096506",
        "stock": "A096506",
        "msrp": "54305",
        "type": "New",
        "year": "2015",
        "make": "Audi",
        "model": "Q5",
        "imagelist": [
            "http:\/\/content.homenetiol.com\/640x480\/53ef04aa3c46463aaa4fd91b13c00037.jpg",
            ...
        ],
        "stockimage": ""
    },
    {
        "vin": "WAU3GAFD2FN030313",
        ...
    }
]

pastebin complete JSON