2012-10-18 33 views
4

我有一個XML文件,其中一些標籤偶爾可能爲空。當我使用PHP讀取該文件並使用json_encode對其進行編碼時,JSON將所有空標籤轉換爲空物件,而我更喜歡它們 - 空字符串。停止/避免此轉換的最佳方法是什麼?json_encode爲空的XML標籤創建空對象

編輯: 我不喜歡從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; 
+0

你是不是覺得空了?空白或具有根標記? – Baba

+0

是否可以發佈一些示例輸入和期望的輸出,所以我們可以確切地看到您的意思? – Lix

+0

空像 Flot2011

回答

3

您CA:

我的實現很簡單ñ嘗試

$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); 
    } 
} 
+0

這或多或少是我現在這樣做的方式。問題是XML文件可能很大,並且可能有很多這樣的文件,所以存在性能問題。 – Flot2011

+0

我們有多大?你可以把這樣的文件粘貼bin讓我們運行一些基準 – Baba

+0

關於第二個想法,我會接受你的答案,我只能在我的主迭代循環內完成,在那裏我正在通過所有記錄。謝謝。 – Flot2011

0

我覺得上面的功能filterEmptyArray()需要一個除了它不刪除之前作爲值的零。例如, 0也會變成''

if (empty($v) && is_array($v)) 
    $a[$k] = ""; 
}