【问题标题】:Parsing Sub-Object from an XML Feed with objects从带有对象的 XML 提要中解析子对象
【发布时间】:2019-12-23 05:06:27
【问题描述】:

我有一个用于跟踪包裹的 XML Feed

<xyz_name_of_company-objects version="1.0">
<object pk="1" model="awb">
<field type="BigIntegerField" name="awb_number">5818537179673</field>
<field type="CharField" name="origin">AMSTERDAM</field>
<field type="CharField" name="destination">BERLIN</field>
<field type="CharField" name="current_location_name">BRUSSELS</field>
<field type="CharField" name="current_location_code">BRSL</field>
<field name="scans">
<object pk="1" model="scan_stages">
<field type="DateTimeField" name="updated_on">17 March, 2019, 03:10 </field>
<field type="CharField" name="status">In-Transit</field>
<field type="CharField" name="reason_code_number">002</field>
<field type="CharField" name="scan_status">PICKUP</field>
<field type="CharField" name="location_city">AMSTERDAM</field>
<field type="CharField" name="location_type">Hub</field>
<field type="CharField" name="city_name">AMSTERDAM</field>
<field type="CharField" name="Employee">JOEL - O94383</field>
</object>
<object pk="2" model="scan_stages">
<field type="DateTimeField" name="updated_on">18 March, 2019, 22:22 </field>
<field type="CharField" name="status">Bag scanned at Hub</field>
<field type="CharField" name="reason_code"> - </field>
<field type="CharField" name="reason_code_number">003</field>
<field type="CharField" name="scan_status">IN</field>
<field type="CharField" name="location">I1H</field>
<field type="CharField" name="location_city">AMSTERDAM</field>
<field type="CharField" name="location_type">Hub</field>
<field type="CharField" name="city_name">AMSTERDAM</field>
<field type="CharField" name="Employee">ELLEN - 49821</field>
</object>
</field>
</object>
</xyz_name_of_company-objects>

到目前为止,我一直在使用以下代码行来获取原始数据,例如 awb_number、origin、destination

$url = A Get URL with Credentials
$xml = simplexml_load_file($url);

$awb = $xml->object->field[0];
$origin= $xml->object->field[1];
$destination = $xml->object->field[3];

现在我担心在其中获取数据

object pk="1" model="scan_stages"

对于不同的扫描阶段,我称之为扫描状态

[仅供参考:这些是快递公司网络中包裹的不同阶段]。

最后我想建一个数组

    $SCANS = array(); // Master Array for all the Scans available
    foreach($xml->object->field[6] $scans)
    {
    $SCAN[] = array(); // Sub Array for each Scan
    foreach($scans as $scan_info)
    {
    $SCAN['scan'] = array($scan_info['name']=>$scan_info);
    }

    $SCANS[] = $SCAN;
    }

所以,输出应该是这样的

{
    "scan": {
        "employee": "JOEL - O94383",
        "location": "Amsterdam",
        "updated_on": "17 March, 2019, 03:10",
    }
    "scan": {
        "employee": "ELLEN - 49821",
        "location": "Amsterdam"
        "updated_on": "18 March, 2019, 22:22",
    }
}

我当前的输出每次扫描的数组看起来像

[
    {
        "": {
            "@attributes": {
                "type": "CharField",
                "name": "Employee"
            },
            "0": "JOEL - O94383"
        }
    },
    {
        "": {
            "@attributes": {
                "type": "CharField",
                "name": "location_city"
            },
            "0": "AMSTERDAM"
        }
    },
    {
        "": {
            "@attributes": {
                "type": "DateTimeField",
                "name": "updated_on"
            },
            "0": "17 March, 2019, 03:10"
        }
    }
]

提前致谢!

【问题讨论】:

    标签: php arrays multidimensional-array associative-array dynamic-arrays


    【解决方案1】:

    即使不是严格的错误,我认为最好有一个scan数组而不是结构中的几个scan键。

    $object = $xml->xpath("//object[@pk = '1' and @model = 'awb']")[0] ;
    
    // get all the scan stages object
    $scanObjects = $object->xpath(".//object[@model = 'scan_stages']");
    
    $scans = array(); // store all the scans info
    foreach($scanObjects as $scanObject){
        $scan = array() ; // store the current scan info
    
        // iterate on all "field" in the current scan stage
        foreach($scanObject->xpath('field') as $field){
            $key = (string)$field->xpath('@name')[0] ; // name of the field
            $value = (string) $field ; // value of the field
    
            $scan[ $key ] = $value ; // add the field to the current scan info
        }
    
        $scans[] = $scan ; // add the current scan to the scan list
    }
    
    echo json_encode($scans);
    

    输出:

    [{
        "updated_on":"17 March, 2019, 03:10 ",
        "status":"In-transit",
        "reason_code_number":"002",
        "scan_status":"PICKUP",
        "location_city":"AMSTERDAM",
        "location_type":"Hub",
        "city_name":"AMSTERDAM",
        "Employee":"JOEL - O94383"
    },{
        "updated_on":"18 March, 2019, 22:22 ",
        "status":"Bag scanned at Hub",
        "reason_code":" - ",
        "reason_code_number":"003",
        "scan_status":"IN",
        "location":"I1H",
        "location_city":"AMSTERDAM",
        "location_type":"Hub",
        "city_name":"AMSTERDAM",
        "Employee":"ELLEN - 49821"
    }]
    

    【讨论】:

    • 效果很好,但是如何根据名称调用特定元素。就像我只想要 3 个值 updated_on,location_city,employee
    • 您可以定义一个数组$neededKeys = array('updated_on', 'location_city', 'employee');并在将信息添加到$scan数组之前添加一个额外的测试:if( in_array($key, $neededKeys) ) $scan[ $key ] = $value ;
    猜你喜欢
    • 2017-10-14
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多