0

次のコードを使用して次のxmlを解析し、配列のキーとして各個人のIDを追加し、配列の値として名前を追加しています。

コードは正しく機能しますが、配列は機能しません。

   $array = array();
   $category = $xml->xpath('descendant::person');
    foreach ($person as $p) {
    $array[$p['id']] = $p['name'];
    }
 <?xml version="1.0" encoding="utf-8"?>
 <people>
   <person name="Joe" id="134">
   <person name="Jack" id="267">
   </person>
   </person>

   <person name="Ray" id="388">
   <person name="John" id="485">
   <person name="Rayan" id="900">
   </person>
   </person>

   <person name="Alex" id="590">
   </person>
 </people>

XMLは無効ですが、有効にすることはできません。ただし、コードは機能しており、IDと値を配列に割り当てる必要があります。

4

3 に答える 3

1

これが正しい方法かどうかはわかりませんが、これをテストして問題なく動作しました。

$xml = simplexml_load_string($response);
 $category = $xml->xpath('descendant::person');

 $array = array();

  foreach($category as $each){
    $name_obj = $each->attributes()->name[0];

     $name_json = json_encode($name_obj);
    $name_array = json_decode($name_json, TRUE);


    $id_obj = $each->attributes()->id[0];

  $id_json = json_encode($id_obj);
  $id_array = json_decode($id_json, TRUE);

  $array[$id_array[0]] = $name_array[0];
}

 print_r($array);
于 2012-12-28T05:57:08.357 に答える
1

ここで起こっている小さな問題がたくさんあります...しかし、最大の問題は、simplexmlオブジェクトノードを配列のインデックスとして使用できないことです。文字列または整数として手動でキャストする必要があります。また、xpath式を少し調整することをお勧めします。ループは、存在しない変数である$ personではなく、$categoryに配置する必要があります。別の方法としてこれを試してください。

$array = array();
$category = $xml->xpath('//person');
while(list( , $p) = each($category)) {
        $array[(string)$p['id']] = (string)$p['name'];
}
print_r($array);

また、XMLが有効なXMLでない場合、それは重要です... simplexmlライブラリは無効なXMLでは正しく機能しません(例のXMLには不適切なネストがあります)。

于 2012-12-28T06:04:12.943 に答える
-1

XMLは次のようになってはいけませんか?:

<?xml version="1.0" encoding="utf-8"?>
<people>
    <person name="Joe" id="1"></person>
    <person name="Jack" id="2"></person>
    <person name="Ray" id="3"></person>
    <person name="John" id="4"></person>
    <person name="Alex" id="5"></person>
</people>
于 2012-12-28T05:48:28.920 に答える