2011-02-01 7 views
3

私はファイルをに変換します.JAONはPHPです。 JSON出力は、しかし、私は、スクリプトを変更する必要があるように私は、XMLファイルの完全なコンテンツを取得PHPを使用して属性なしでXMLをJSONに変換しますか?

// Open XML file with SimpleXML. 
$xml = simplexml_load_file('file.xml'); 
// Convert XML content to JSON. 
$json = json_encode($xml); 
// Output JSON. 
echo $json; 

:私はこの単純なPHPスクリプトを使用しています

<content> 
    <!-- other elements... --> 
    <box id="1"> 
     <a>...</a> 
     <b>...</b> 
     <c>...</c> 
    </box> 
    <box id="2"> 
     <a>...</a> 
     <b>...</b> 
     <c>...</c> 
    </box> 
    <box id="3"> 
     <a>...</a> 
     <b>...</b> 
     <c>...</c> 
    </box> 
    <!-- more <box> elements... --> 
    <!-- other elements... --> 
</content> 

:XMLファイルには、次のようになります:

  • <box> 要素ではなく、完全なファイルのみJSONを取得します。
  • 要素属性のないJSONを取得します。

これは私が出力として取得したいものの例である:

[{"a":"...","b":"...","c":"..."}, 
{"a":"...","b":"...","c":"..."}, 
{"a":"...","b":"...","c":"..."}] 

、私を助けて、私はこれをどのように行うことができますしてください?ベストプラクティスは何ですか?

ありがとうございます。

+2

JSON!XMLをJSONに変換する簡単な方法は私の王国です! " –

答えて

1

ノード名(box)が変化しない場合、あなたはxpathを使用することができます。

$xml = simplexml_load_file('test.xml'); 
$arr = (array) $xml -> xpath('box'); 

...しかし、各boxidを持っているので、これは狂気のようなものにつながっ:

$final = array(); 
foreach ($arr as $box) { 
    $box = (array) $box; 
    unset($box['@attributes']); 
    $final[] = $box; 
} 

私はもっと良い方法を探すつもりでしたが、私は浮き彫りを見始めたので、私はあきらめました。つまり、配列を$finalにするだけです。ゴッドスピード。

+2

「JSONにXMLを変換する簡単な方法!簡単な方法は、XMLを変換するための$ XMLをループにする必要があります – sdleihssirhc

1

次のような、個々の要素にアクセスしようとすることができ:この意志ループは、各ボックス要素を通して

$boxes = array(); 
// Loop through each box element. 
foreach($xml->box as $box) { 
    // Add an array with the a, b, and c children. 
    $boxes[] = array('a' => $box-> a, 'b' => $box->b, 'c' => $box->c); 
} 
$json = json_encode($boxes); 

配列にA、B、Cのタグを引き出し、次にJSONの配列をコードSimpleXMLオブジェクトの代わりに。

1

基本的には、他の回答者が自分でJSON出力を提案してフォーマットする必要があります。

これは私に、あなたが望むものに似たJSONを与えます。これは再帰的なので、どのXMLでも動作します。

このXML:

<?xml version="1.0" encoding="UTF-8"?> 
    <lss> 
     <image type="Profile Image" part_id="11017" media="Image1.jpg" base="Image1" ext="jpg" width="128" height="96"/> 
     <image type="Profile Image" part_id="11016" media="Image2.jpg" base="Image2" ext="jpg" width="180" height="225"/> 
    </lss> 

は次のようにフォーマットされます:

あなたのための罰金かもしれませんが、あなただけの$ final_treeを変更する必要があると思いますされていない場合、わずかに配列を取得するために
{ 
    "image":[ 
     { 
      "type":"Profile Image", 
      "part_id":"11017", 
      "media":"Image1.jpg", 
      "base":"Image1", 
      "ext":"jpg", 
      "width":"128", 
      "height":"96" 
     }, 
     { 
      "type":"Profile Image", 
      "part_id":"11016", 
      "media":"Image2.jpg", 
      "base":"Image2", 
      "ext":"jpg", 
      "width":"180", 
      "height":"225" 
     } 
    ] 
    } 

トップレベルの裸の "ボックス"オブジェクトの

function xml2json($xmlString) 
    { 
     $start_tree = (array) simplexml_load_string(trim($xmlString)); 

     $final_tree = array(); 

     loopRecursivelyForAttributes($start_tree,$final_tree); 

     return json_encode($final_tree); 
    } 

    function loopRecursivelyForAttributes($start_tree,&$final_tree) 
    { 
     foreach ($start_tree as $key1=>$row1) 
     { 
      if(!array_key_exists($key1, $final_tree)) 
      { 
       $final_tree[$key1] = array(); 
      } 

      // If there is only one sub node, then there will be one less 
      // array - ie: $row1 will be an array which has an '@attributes' key 
      if(array_key_exists('@attributes', $row1)) 
      { 
       $row1 = (array) $row1; 

       getValues($start_tree,$final_tree, $key1, $row1); 
      } 
      else 
      { 
       foreach ($row1 as $row2) 
       { 
        $row2 = (array) $row2; 

        getValues($start_tree,$final_tree, $key1, $row2); 
       } 
      } 
     } 
    } 

    function getValues($start_tree,&$final_tree, $key1, $row2) 
    { 
     foreach ($row2 as $key3=>$val3) 
     { 
      $val3 = (array) $val3; 

      if($key3 == '@attributes') 
      { 
       $final_tree[$key1][] = $val3; 
      } 
      else 
      { 
       $temp_parent = array(); 

       $temp_parent[$key3] = $val3; 

       loopRecursivelyForAttributes($temp_parent,$final_tree[$key1][count($final_tree[$key1])-1]); 
      } 
     } 
    }    
あなたはすべての個々のタグを引き出して、新しい変数にそれを入れて、その後、json_encode()それは
関連する問題