SimpleXML,试图循环遍历元素并从值中创建关联数组

时间:2013-01-02 01:32:11

标签: php simplexml

我无法让SimpleXML工作,因为我也需要它。我想用元素创建一个关联数组。这是xml的样子

<?xml version="1.0"?>
<RateV4Response>
<Package ID="1">
<ZipOrigination>11901</ZipOrigination>
<ZipDestination>91730</ZipDestination>
<Pounds>0</Pounds>
<Ounces>3.5</Ounces>
<Size>REGULAR</Size>
<Machinable>TRUE</Machinable>
<Zone>8</Zone>

<Postage CLASSID="3">
    <MailService>Express Mail</MailService>
    <Rate>28.00</Rate>
</Postage>
<Postage CLASSID="2">
    <MailService>Express Mail Hold For Pickup</MailService>
    <Rate>28.00</Rate>
</Postage>

MailService和Rate应该是一个数组。 这是我的php:

$usps_response = new SimpleXMLElement($result);
foreach($usps_response->Package->Postage as $service)
    $data[] = array($service->MailService => $service->Rate);

我在这里看不到错误,但$ data是28个空元素。我也试过这个:

$data[] = array($service['MailService'] => $service['Rate']);

但这没有帮助

如果我只为$ data []分配$ service,那么我会看到28个元素,每个元素包含3个子元素(属性,MailService和Rate)。

我做错了什么?

以下是帮助查看数据的图片 enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

此处发布的XML不是有效的XML,因此我必须假设它不完整或者邮政服务产生了一些不太有用的东西。通过一些更改,我能够使其工作。请参阅 http://www.laprbass.com/RAY_temp_user193.php

<?php // RAY_temp_user193.php
error_reporting(E_ALL);
echo '<pre>';

// TEST DATA
$xml = <<<ENDXML
<?xml version="1.0"?>
<RateV4Response>
<Package ID="1">
<ZipOrigination>11901</ZipOrigination>
<ZipDestination>91730</ZipDestination>
<Pounds>0</Pounds>
<Ounces>3.5</Ounces>
<Size>REGULAR</Size>
<Machinable>TRUE</Machinable>
<Zone>8</Zone>

<Postage CLASSID="3">
    <MailService>Express Mail</MailService>
    <Rate>28.00</Rate>
</Postage>
<Postage CLASSID="2">
    <MailService>Express Mail Hold For Pickup</MailService>
    <Rate>28.00</Rate>
</Postage>
</Package>
</RateV4Response>
ENDXML;

// MAKE AN OBJECT
$obj = SimpleXML_Load_String($xml);
var_dump($obj);

现在你想对这个对象做什么?

答案 1 :(得分:0)

在你的阵列中你想要一个像Express Mail Hold For Pickup这样的键似乎很奇怪但是我们走了:

foreach($usps_response->Package->Postage as $service)
    $data[] = array((string)$service->MailService => (string)$service->Rate);