PHP使用非一致对象解析XML提要

时间:2014-04-05 09:35:29

标签: php mysql xml xpath

我需要将外部XML Feed处理到我的Mysql DB中。 XML提要包含房地产对象。问题是节点中的字段数不一致。某些节点(房地产对象)有额外的字段或缺少某些字段。

以下是2个房地产对象的一部分:

<Object>
<ObjectCode>CM10272</ObjectCode>
<ObjectDetails>
<Adres>
<Nederlands>
<Straatnaam>Dokter van Nieveltweg</Straatnaam>
<Huisnummer>0</Huisnummer>
**<HuisnummerToevoeging>ong</HuisnummerToevoeging>**
<Postcode>1901 GD</Postcode>
<Woonplaats>CASTRICUM</Woonplaats>
<Land>NL</Land>
</Nederlands>
</Adres>
etc


<Object>
<ObjectCode>CM10280</ObjectCode>
<ObjectDetails>
<Adres>
<Nederlands>
<Straatnaam>De Houtwal</Straatnaam>
<Huisnummer>44</Huisnummer>
<Postcode>1852 RP</Postcode>
<Woonplaats>HEILOO</Woonplaats>
<Land>NL</Land>
</Nederlands>
</Adres>
etc

正如您所看到的,第一个节点有一个名为&#34; HuisnummerToevoeging&#34;的额外元素。

我使用XPATH处理xml提要:

$values = <<<XPATH
(
    ObjectCode
    |ObjectDetails/Adres/Nederlands/Straatnaam
    |ObjectDetails/Adres/Nederlands/Huisnummer
    |ObjectDetails/Adres/Nederlands/HuisnummerToevoeging
    |ObjectDetails/Adres/Nederlands/Postcode
    |ObjectDetails/Adres/Nederlands/Woonplaats

)
XPATH;

$pattern = <<<SQL
INSERT INTO woningen
  (
    ObjectCode, Straat, Huisnr, Huistoe, Postcode, Woonplaats, PrijsVoorvoegsel, Prijs, PrijsCondiditie
  )
  VALUES
  (
    '%s','%s', '%d', '%s', '%s', '%s', '%s', '%d', '%s'
  )
SQL;

foreach ($woning as $woning)
{
    $data = $woning->xpath($values);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern, $escaped);

    //INSERT INTO MYSQL
}

如何跳过XML Feed中不存在的元素?我必须为每个房地产对象总共处理70个字段,有些仅使用10个字段。此外,XML feed可以使用额外的字段进行更新,恕不另行通知,因此我需要以智能方式处理它。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的另一种方法。

我创建了一个变量和xpath数组到值:

$NeedData = array(  "ObjectCode"=>"ObjectCode",
                    "Straat"=>"ObjectDetails/Adres/Nederlands/Straatnaam",
                    "Huisnr"=>"ObjectDetails/Adres/Nederlands/Huisnummer",
                    "Huistoe"=>"ObjectDetails/Adres/Nederlands/HuisnummerToevoeging",
                    "Postcode"=>"ObjectDetails/Adres/Nederlands/Postcode",
                    "Woonplaats"=>"ObjectDetails/Adres/Nederlands/Woonplaats",
                 etc

然后使用一个小的foreach循环我检查一个元素是否存在XML对象,如果没有,那么我将值设置为“null”

foreach ($XML_woning as $woning){

    foreach($NeedData as $key=>$value){
        $val = $woning->xpath($value);
        if($value!=""){
            if(isset($val[0])){
                $$key = $val[0];
            }else{
                $$key="null";
            }
        }else{
            $$key="null";
        }
    }