从带有对象的 XML Feed 中解析子对象

Α

我有一个 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];

现在我关心的获取数据

对象 pk="1" 模型="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"
        }
    }
]

提前致谢!

乔佛里·施密茨

即使不是严格的错误,我认为最好有一个扫描数组而不是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"
}]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

解析奇怪的xml feed

解析xml RSS feed文件

带有PHP MySQL查询的XML RSS feed中的编码错误“未定义实体”

问:KDB + / PyQ发布者订阅者带有python对象中的feed

解析Java中的单个xml对象

XML Feed数据中的字符无效

使用xml子对象,Python中的ElementTree

如何在Android XML可绘制对象中绘制带有圆角的线

无法解析XML对象和尝试对象反序列化和LINQ的子级

Django - “Feed”对象不可调用

带有FOSUserBundle的对象

使用 plsql 解析带有子节点的 XML 格式

从 XML 解析 -> JSON -> Php 对象

无法识别JSON feed对象中的Javascript变量

解析属性键中带有特殊字符的JSON对象

在Python中解析XML:TypeError:“ str”对象不可调用

解析Java对象到XML文件中缺少适当的名称

麻烦在PHP中解析XML对象(laravel 5.8)

如何使用 JAXB 解析 Java 中嵌套的 XML 对象列表?

用php xpath替换XML feed中的值

从JSON或XML feed导入数据并在Android中创建列表

将带有其他节点的XML转换为Java对象

带有注意事项的空XML节点:尝试获取非对象的属性“ ref”

使用带有两个列表的对象的XDocument创建XML

PHP 使用 SimpleXML 对象从 XML 转换为 JSON。带有 <items> 标签的数组导致问题

如何使用带有 Java 对象作为参数的 XML 转换器?

Xml使用LINQ在对象内部的对象列表中解析对象

带有子对象的json中的Angulajs ng-options

无法使用在子对象和兄弟对象中具有相同对象名称的XML序列化器来序列化对象