2016-04-12 7 views
0

Ich arbeite mit einem Remote-XML, das ich zu JSON analysieren muss, um Informationen an eine mobile Anwendung zu übertragen. Ich benutze json_encode zu so.json_encode Ziel spezifischer Knoten, Array zu erhalten

Mein Problem ist, dass es für einen bestimmten Knoten manchmal ein Array ist, manchmal ist es ein Wörterbuch. Ich müsste diesen spezifischen Knoten zielen und es immer ein Array machen.

Meine App stürzt ab, wenn es ein Wörterbuch und kein Array ist, also muss ich [...].

Mein xml wie folgt aussieht:

<infogeneral> 
    <idspotwebcamhd>6</idspotwebcamhd> 
    <spot>Anglet Sables d'Or</spot> 
    <url/> 
    <vagues/> 
    <vent>GFS</vent> 
    <ventdate>2016-04-12 06:00:00</ventdate> 
    <venttimestamp>1460433600</venttimestamp> 
    <houle>WW3</houle> 
    <houledate>2016-04-12 06:00:00</houledate> 
    <houletimestamp>1460433600</houletimestamp> 
    <tempeaucelsius>13</tempeaucelsius> 
    </infogeneral> 
    <day> 
    <date>Tue 12 Apr 2016</date> 
    <datetimestamp>1460484000</datetimestamp> 
    <firstlight>06:55</firstlight> 
    <lastlight>21:17</lastlight> 
    <creneau> 
     <heure>20.00</heure> 
     <timestamp>1460484000</timestamp> 
     <ventnoeud>9</ventnoeud> 
     <ventms/> 
     <ventkmh>17</ventkmh> 
     <ventbft/> 
     <ventmph/> 
     <houlemetre>1.10</houlemetre> 
     <houlepied/> 
     <periode>12</periode> 
     <temp>15</temp> 
     <ventdirection>so</ventdirection> 
     <houledirection>ono</houledirection> 
     <pictogramme>3cloud_lightrain.png</pictogramme> 
    </creneau> 
    </day> 
    <day> 
    <date>Wed 13 Apr 2016</date> 
    <datetimestamp>1460505600</datetimestamp> 
    <firstlight>06:53</firstlight> 
    <lastlight>21:18</lastlight> 
    <principal> 
     <heure>14:00</heure> 
     <pictogrammeprincipal>1cloud_norain.png</pictogrammeprincipal> 
     <tempmincelsius>13</tempmincelsius> 
     <tempmaxcelsius>17</tempmaxcelsius> 
    </principal> 
    <creneau> 
     <heure>08.00</heure> 
     <timestamp>1460527200</timestamp> 
     <ventnoeud>17</ventnoeud> 
     <ventms/> 
     <ventkmh>32</ventkmh> 
     <ventbft/> 
     <ventmph/> 
     <houlemetre>1.20</houlemetre> 
     <houlepied/> 
     <periode>10</periode> 
     <temp>13</temp> 
     <ventdirection>sso</ventdirection> 
     <houledirection>ono</houledirection> 
     <pictogramme>4cloud_norain.png</pictogramme> 
    </creneau> 
    <creneau> 
     <heure>11.00</heure> 
     <timestamp>1460538000</timestamp> 
     <ventnoeud>19</ventnoeud> 
     <ventms/> 
     <ventkmh>36</ventkmh> 
     <ventbft/> 
     <ventmph/> 
     <houlemetre>1.40</houlemetre> 
     <houlepied/> 
     <periode>6</periode> 
     <temp>15</temp> 
     <ventdirection>so</ventdirection> 
     <houledirection>so</houledirection> 
     <pictogramme>2cloud_norain.png</pictogramme> 
    </creneau> 
    <creneau> 
     <heure>14.00</heure> 
     <timestamp>1460548800</timestamp> 
     <ventnoeud>16</ventnoeud> 
     <ventms/> 
     <ventkmh>29</ventkmh> 
     <ventbft/> 
     <ventmph/> 
     <houlemetre>1.30</houlemetre> 
     <houlepied/> 
     <periode>6</periode> 
     <temp>17</temp> 
     <ventdirection>oso</ventdirection> 
     <houledirection>so</houledirection> 
     <pictogramme>1cloud_norain.png</pictogramme> 
    </creneau> 
    <creneau> 
     <heure>17.00</heure> 
     <timestamp>1460559600</timestamp> 
     <ventnoeud>7</ventnoeud> 
     <ventms/> 
     <ventkmh>13</ventkmh> 
     <ventbft/> 
     <ventmph/> 
     <houlemetre>1.00</houlemetre> 
     <houlepied/> 
     <periode>5</periode> 
     <temp>17</temp> 
     <ventdirection>no</ventdirection> 
     <houledirection>oso</houledirection> 
     <pictogramme>0cloud.png</pictogramme> 
    </creneau> 
    <creneau> 
     <heure>20.00</heure> 
     <timestamp>1460570400</timestamp> 
     <ventnoeud>4</ventnoeud> 
     <ventms/> 
     <ventkmh>7</ventkmh> 
     <ventbft/> 
     <ventmph/> 
     <houlemetre>0.80</houlemetre> 
     <houlepied/> 
     <periode>10</periode> 
     <temp>15</temp> 
     <ventdirection>ne</ventdirection> 
     <houledirection>ono</houledirection> 
     <pictogramme>0cloud.png</pictogramme> 
    </creneau> 
    </day> 

Mein PHP XML zu JSON konvertieren (ich eine XML-Datei laden eine JSON-Datei zu speichern):

$xml = simplexml_load_file($in_filepath); 
$json = json_encode($xml); 
file_put_contents ($out_filepath, $json); 

Für meine Prüfungen vor der Produktion, mein php wie folgt aussieht:

$xml = simplexml_load_file('http://www.example.com/myFile.xml'); 
$json = json_encode($xml); 
print_r($json); 

Nach json_encode:

"infogeneral":{ 

    "idspotwebcamhd":"6", 
    "spot":"Anglet Sables d'Or", 
    "url":{ 
    }, 
    "vagues":{ 
    }, 
    "vent":"GFS", 
    "ventdate":"2016-04-12 06:00:00", 
    "venttimestamp":"1460433600", 
    "houle":"WW3", 
    "houledate":"2016-04-12 06:00:00", 
    "houletimestamp":"1460433600", 
    "tempeaucelsius":"13" 

}, 
"day":[ 

    { 
     "date":"Tue 12 Apr 2016", 
     "datetimestamp":"1460484000", 
     "firstlight":"06:55", 
     "lastlight":"21:17", 
     "creneau":{ 
      "heure":"20.00", 
      "timestamp":"1460484000", 
      "ventnoeud":"9", 
      "ventms":{ 
      }, 
      "ventkmh":"17", 
      "ventbft":{ 
      }, 
      "ventmph":{ 
      }, 
      "houlemetre":"1.10", 
      "houlepied":{ 
      }, 
      "periode":"12", 
      "temp":"15", 
      "ventdirection":"so", 
      "houledirection":"ono", 
      "pictogramme":"3cloud_lightrain.png" 
     } 
    }, 
    { 
     "date":"Wed 13 Apr 2016", 
     "datetimestamp":"1460505600", 
     "firstlight":"06:53", 
     "lastlight":"21:18", 
     "principal":{ 
      "heure":"14:00", 
      "pictogrammeprincipal":"1cloud_norain.png", 
      "tempmincelsius":"13", 
      "tempmaxcelsius":"17" 
     }, 
     "creneau":[ 
      { 
       "heure":"08.00", 
       "timestamp":"1460527200", 
       "ventnoeud":"17", 
       "ventms":{ 
       }, 
       "ventkmh":"32", 
       "ventbft":{ 
       }, 
       "ventmph":{ 
       }, 
       "houlemetre":"1.20", 
       "houlepied":{ 
       }, 
       "periode":"10", 
       "temp":"13", 
       "ventdirection":"sso", 
       "houledirection":"ono", 
       "pictogramme":"4cloud_norain.png" 
      }, 
      { 
       "heure":"11.00", 
       "timestamp":"1460538000", 
       "ventnoeud":"19", 
       "ventms":{ 
       }, 
       "ventkmh":"36", 
       "ventbft":{ 
       }, 
       "ventmph":{ 
       }, 
       "houlemetre":"1.40", 
       "houlepied":{ 
       }, 
       "periode":"6", 
       "temp":"15", 
       "ventdirection":"so", 
       "houledirection":"so", 
       "pictogramme":"2cloud_norain.png" 
      }, 
      { 
       "heure":"14.00", 
       "timestamp":"1460548800", 
       "ventnoeud":"16", 
       "ventms":{ 
       }, 
       "ventkmh":"29", 
       "ventbft":{ 
       }, 
       "ventmph":{ 
       }, 
       "houlemetre":"1.30", 
       "houlepied":{ 
       }, 
       "periode":"6", 
       "temp":"17", 
       "ventdirection":"oso", 
       "houledirection":"so", 
       "pictogramme":"1cloud_norain.png" 
      }, 
      { 
       "heure":"17.00", 
       "timestamp":"1460559600", 
       "ventnoeud":"7", 
       "ventms":{ 
       }, 
       "ventkmh":"13", 
       "ventbft":{ 
       }, 
       "ventmph":{ 
       }, 
       "houlemetre":"1.00", 
       "houlepied":{ 
       }, 
       "periode":"5", 
       "temp":"17", 
       "ventdirection":"no", 
       "houledirection":"oso", 
       "pictogramme":"0cloud.png" 
      }, 
      { 
       "heure":"20.00", 
       "timestamp":"1460570400", 
       "ventnoeud":"4", 
       "ventms":{ 
       }, 
       "ventkmh":"7", 
       "ventbft":{ 
       }, 
       "ventmph":{ 
       }, 
       "houlemetre":"0.80", 
       "houlepied":{ 
       }, 
       "periode":"10", 
       "temp":"15", 
       "ventdirection":"ne", 
       "houledirection":"ono", 
       "pictogramme":"0cloud.png" 
      } 
     ] 
    }, 

Für den ersten Tag habe ich nur einen "Creneau", also stürzt er ab.

Ich habe versucht, dies aus: http://www.binarytides.com/convert-simplexml-object-to-array-in-php/

Aber es ändert den ganzen Baum.

Irgendeine Idee, wie ich das schaffen könnte?

+0

* manchmal ist es ein Array, manchmal ist es ein Wörterbuch * ... wie kann das sein, wie xml Node ist weder ein Array noch ein Wörterbuch? Und wo ist dein PHP-Code, um XML einzulesen und den json_encode auszuführen? – Parfait

+0

Ich vielleicht falsch, tut mir leid. "creneau" wird zu einem Array oder Wörterbuch in meiner App, ob ich eine oder mehrere in der XML-Datei habe. Ich habe nur den PHP-Code, den ich verwende. – David

Antwort

0

Ich denke, eine Kombination von SimpleXMLElement::count mit SimpleXMLElement::xpath könnte Ihnen helfen, einen einzelnen Eintrag zu identifizieren und einen weiteren gefälschten Eintrag hinzuzufügen. Ich denke, das ist eine schlechte Methode, aber wenn Sie keinen Zugriff auf die mobile Anwendung haben, könnte dies eine Umgehung sein, wenn der leere Eintrag keine Nebenwirkungen verursacht.

Aber um eine saubere Lösung zu erreichen, empfehle ich, den Code in der mobilen Anwendung zu ändern.

$xml = SimpleXMLElement(); 

// get your data into $xml here 

$creneaus = $xml->xpath('/infogeneral/day/creneau'); 

foreach ($creneaus as $creneau) { 
    if ($creneau->count() == 1) { 
     $parent = $creneau->xpath('..'); 
     $creneauEmpty = simplexml_load_string('<creneau><heure>...</creneau>'); 
     $parent->addChild($creneauEmpty); 
    } 
} 
+0

Vielen Dank für Ihre Antwort, ich werde mir das ansehen. Aber ich denke, ich kann kein falsches Kind hinzufügen, wenn ich möchte, dass die Dinge gut funktionieren. Tatsächlich habe ich in meiner App (iOS) eine if-Anweisung, die behandelt, ob es ein Array oder ein Wörterbuch ist, und es funktioniert gut. Aber der Android Dev möchte, dass ich das in der XML zu JSON API behandle. – David

+0

Ich lese über Typcasting in ein Objekt hier: https://secure.phabricator.com/book/phabflavor/article/php_pitfalls/ (Suche nach "(Objekt)") Ich werde das später untersuchen, wenn ich etwas Zeit finden kann – noreabu