2016-06-10 51 views
1

使用cURL,我正在導航到一個網頁。隨着來自卷邊腳本的響應,我主要做以下從html字符串中加載JSON數據

$dom = new DOMDocument(); 
$dom->loadHTML($response); 

如果我預期,我可以看到所有的HTML代碼,該頁面輸出$dom。在代碼中,有一個特定部分,如下所示:

<script id="data" type="application/json"> 
<![CDATA[ 
{ 
    sortColumn: "QuoteNumber", 
    quotes: { 
     "Data": 
     [ 
      { 
       "ID":3235720, 
       "Date":"20 May 2016", 
       "QuoteNumber":"Q12415", 
       "Name":"Some Name", 
       "Client":"Some Client", 
       "StateName":"Issued", 
       "Url":"/Quote/View/3235720" 
      } 
     ] 
    } 
} 
]]> 
</script> 

有沒有什麼辦法可以定位這個特定的代碼塊?我基本上需要加載JSON並獲取報價的ID。這可能嗎?

+2

那塊JSON的是無效的。你有沒有把它正確地複製到你的問題中?有三個開放大括號和只有一個右大括號。還有一些屬性(例如'sortColumn')沒有被引用,這在JSON中是無效的。 – trincot

+0

嗨,謝謝。有很多JSON數據,我刪除了很多,所以這個問題很簡單。我一定錯過了一些括號。謝謝 –

回答

2
  1. 你可以使用getElementById("data")
  2. 通過不斷 XML_CDATA_SECTION_NODE比較檢查CDATA節點的<script>標籤。
  3. 使用str_replace()刪除CDATA標記。
  4. 使用json_decode將您的內容解析爲JSON。

順便說一句,CDATA中的內容實際上是一個格式不正確的JSON。如下所述應更正爲:

<![CDATA[ 
{ 
    "sortColumn" : "QuoteNumber", 
    "quotes": { 
     "Data": 
     [ 
      { 
       "ID":3235720, 
       "Date":"20 May 2016", 
       "QuoteNumber":"Q12415", 
       "Name":"Some Name", 
       "Client":"Some Client", 
       "StateName":"Issued", 
       "Url":"/Quote/View/3235720" 
      } 
     ] 
    } 
} 
]]> 

我已經在底部還增加了has_json_error()功能,這樣你可以看到一些錯誤消息。

$dom = new DOMDocument(); 
$dom->loadHTML($response); 
$data = $dom->getElementById("data"); 
$content = ''; 
foreach ($data->childNodes as $child) { 
    if ($child->nodeType == XML_CDATA_SECTION_NODE) { 
     $content = $child->textContent; 
    } 
} 
$content = str_replace(array("<![CDATA[", "]]>"), '', $content); 
$jsons = json_decode($content); 

if(!has_json_error()) { 
    echo $jsons->sortColumn; 
    echo "<br /><br />"; 
    print_r($jsons->quotes); 
    echo "<br /><br />"; 
    $data = $jsons->quotes->Data; 
    foreach($data as $obj) { 
     echo $obj->ID . "<br />"; 
     echo $obj->Date . "<br />"; 
     echo $obj->QuoteNumber . "<br />"; 
     echo $obj->Name . "<br />"; 
     echo $obj->Client . "<br />"; 
     echo $obj->StateName . "<br />"; 
     echo $obj->Url . "<br />"; 
    } 
} 

function has_json_error() { 
    if (function_exists ('json_last_error') && json_last_error() !== JSON_ERROR_NONE) { 
     switch (json_last_error()) { 
      case JSON_ERROR_DEPTH: 
       echo 'JSON_ERROR: - Maximum stack depth exceeded'; 
      break; 
      case JSON_ERROR_STATE_MISMATCH: 
       echo 'JSON_ERROR: - Underflow or the modes mismatch'; 
      break; 
      case JSON_ERROR_CTRL_CHAR: 
       echo 'JSON_ERROR: - Unexpected control character found'; 
      break; 
      case JSON_ERROR_SYNTAX: 
       echo 'JSON_ERROR: - Syntax error, malformed JSON'; 
      break; 
      case JSON_ERROR_UTF8: 
       echo 'JSON_ERROR: - Malformed UTF-8 characters, possibly incorrectly encoded'; 
      break; 
      default: 
       echo 'JSON_ERROR: - Unknown error: ' . json_last_error(); 
      break; 
     }   
     return true; 
    } 
    else if (function_exists ('json_last_error_msg') && json_last_error_msg() !== "No error") { 
     echo ("json_last_error_msg, JSON_ERROR:" . json_last_error_msg()); 
     return true; 
    } 
    return false; 
} 

從上面的代碼段的結果會是這樣的下面:

QuoteNumber 

stdClass Object ( 
    [Data] => Array ( 
     [0] => stdClass Object ( 
      [ID] => 3235720 
      [Date] => 20 May 2016 
      [QuoteNumber] => Q12415 
      [Name] => Some Name 
      [Client] => Some Client 
      [StateName] => Issued 
      [Url] => /Quote/View/3235720 
     ) 
    ) 
) 

3235720 
20 May 2016 
Q12415 
Some Name 
Some Client 
Issued 
/Quote/View/3235720