5

一部のタグが空になることがあるXMLファイルがあります。PHPを使用してこのファイルを読み取り、json_encodeを使用してエンコードすると、JSONはすべての空のタグを空のオブジェクトに変換しますが、空の文字列をそのまま使用します。この変換を停止/回避するための最良の方法は何ですか?

編集:私はこれらのタグをXMLから削除したくないのですが、私にとっては、特定のタグのないXMLエントリと、このタグが空のXMLエントリには違いがあります。

編集2:サンプル入力:

<Family>
  <name>aaa</name> 
  <adults>3</adults>
  <kids />
</Family>

キッズタグは空です

エンコード結果を次のように取得したい

Family[1].name = 'aaa';
Family[1].adults = 3;
Family[1].kids = '';

私が得ているのは:

Family[1].name = 'aaa';
Family[1].adults = 3;
Family[1].kids = Object(); //empty

EDIT3:

私の実装は非常に単純です:

PHPで

$xml = simplexml_load_file($filepath);
echo json_encode($xml, JSON_NUMERIC_CHECK);

JavaScriptで

    objJson = $.parseJSON(xmlhttp.responseText);
        ....
        d["name"] = objJson.Family[i].name;
        d["adults"] = objJson.Family[i].adults;
        d["kids"] = objJson.Family[i].kids;
4

2 に答える 2

4

あなたが試すことができます

$xml = '<Family>
    <name>aaa</name>
    <adults>3</adults>
    <kids />
    <sub>
        <tag>Nice </tag>
        <tag>Food </tag>
        <tag />
    </sub>
</Family>';

$xml = new SimpleXMLElement($xml);
$json = json_encode($xml, JSON_NUMERIC_CHECK);
$json = json_decode($json, true);

var_dump($json); // Before

filterEmptyArray($json); // <------ Filter Empty Array

var_dump($json); // After

array
  'name' => string 'aaa' (length=3)
  'adults' => int 3
  'kids' => 
    array   <------------------- Empty Array
      empty
  'sub' => 
    array
      'tag' => 
        array
          0 => string 'Nice ' (length=5)
          1 => string 'Food ' (length=5)
          2 => 
            array 
              ...

array
  'name' => string 'aaa' (length=3)
  'adults' => int 3
  'kids' => string '' (length=0) <---------- String Conversion
  'sub' => 
    array
      'tag' => 
        array
          0 => string 'Nice ' (length=5)
          1 => string 'Food ' (length=5)
          2 => string '' (length=0) <---------- Supports Recursion (2nd level) 

使用した機能

function filterEmptyArray(array &$a) {
    foreach ( $a as $k => &$v ) {
        if (empty($v))
            $a[$k] = "";
        else
            is_array($v) AND filterEmptyArray($v);
    }
}
于 2012-10-18T22:11:09.270 に答える
1

上記の関数filterEmptyArray()は、値としてゼロを削除しないように追加する必要があると思います。例えば。0も''になります

if (empty($v) && is_array($v))
    $a[$k] = "";
}
于 2016-11-16T15:10:26.640 に答える