2011-11-23 36 views
2

我對XML幾乎一無所知。這個腳本是爲我們寫的...XML - 顯示打開和關閉而不是空元素

我有一個腳本,從數據庫中提取信息並創建一個XML文件。 如果拉字段爲空/空,它正在格式化它像這樣:

<deal_id/> 

我知道,這是有效的,但我需要它格式化,像這樣:

<deal_id></deal_id> 

這裏是腳本有問題。

<?php 
//include global config 
require("config.inc.php"); 
//include MySQL wrapper 
require("Database.singleton.php"); 
// instantiate database 
$db = Database::obtain(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE); 
// define basic xml data 
$xml_root = "<?xml version='1.0' encoding='UTF-8' ?>\n"."<store></store>"; 

$deal_id = $_REQUEST['deal_id']; 

$result = new SimpleXMLElement($xml_root); 

$img_path = "http://www.malldeals.com/admin/images/logos/deals/"; 
$img_na = "image_na.jpg"; 

if ($deal_id != '') { 

$db->connect(); 

// get store and deal details 
$sql_store_deal = "SELECT businesses.id, businesses.business_name, businesses.business_floor, businesses.business_near, businesses.business_phone, businesses.business_address, 
       businesses.business_city, businesses.latitude, businesses.longitude, deals.title AS deal_title, deals.id AS deal_id, deals.percent_off AS deal_discount, deals.sale_price AS deal_price, 
       deals.orig_price AS deal_orig_price, deals.expiry_date AS deal_expires, deals.description AS deal_text, 
        (SELECT file_name 
        FROM images 
        WHERE images.deal_id = deals.id AND size_key = '1') AS thumb2, 
         (SELECT COUNT(poster_id) 
         FROM deals 
         WHERE poster_id=businesses.id) AS num_deals 
       FROM businesses, deals 
       WHERE deals.poster_id=businesses.id 
       AND deals.id='".$db->escape($deal_id)."'"; 
// 
$store_deal_details = $db->query_first($sql_store_deal); 
$store_logo_url = ($store_deal_details[thumb2] != "") ? ($img_path.$store_deal_details[thumb2]) : $img_path.$img_na; 

$result->addChild('id', $store_deal_details[id]); 
$result->addChild('name', utf8_encode($store_deal_details[business_name])); 
$result->addChild('floor', utf8_encode($store_deal_details[business_floor])); 
$result->addChild('near', utf8_encode($store_deal_details[business_near])); 
$result->addChild('phone', utf8_encode($store_deal_details[business_phone])); 
$result->addChild('latitude', $store_deal_details[latitude]); 
$result->addChild('longitude', $store_deal_details[longitude]); 
$result->addChild('address', utf8_encode($store_deal_details[business_address])); 
$result->addChild('city', utf8_encode($store_deal_details[business_city])); 
$result->addChild('num_deals', $store_deal_details[num_deals]); 

$deal_discount = floatval($store_deal_details[deal_discount]); 
$deal_price = floatval($store_deal_details[deal_price]); 
$deal_savings = floatval($store_deal_details[deal_orig_price]) - floatval($store_deal_details[deal_price]); 

$result_deal = $result->addChild('deal'); 
$result_deal->addChild('deal_id', $store_deal_details[deal_id]); 
$result_deal->addChild('title', xml_encode($store_deal_details[deal_title])); 
$result_deal->addChild('discount', $deal_discount); 
$result_deal->addChild('price', $deal_price); 
$result_deal->addChild('savings', $deal_savings); 
$result_deal->addChild('expires', $store_deal_details[deal_expires]); 
$result_deal->addChild('text', xml_encode($store_deal_details[deal_text])); 
$result_deal->addChild('image', $store_logo_url); 

$db->close(); 
} 
else { 
$result->addChild('error', "Missing required parameters"); 
} 

header("Content-Type: text/xml"); 
echo $result->asXML(); 

?> 
+5

你爲什麼需要格式化? – BoltClock

+1

需要格式化,以供第三方使用。 –

回答

1

首先,所有這些陳述是錯誤的:

$result->addChild('id', $store_deal_details[id]); 

正確的語法是這樣的:

$result->addChild('id', $store_deal_details[ 'id' ]); 

關於你問題,通過例如''作爲addChild()的第二個參數應該創建你想要的。

此外,該

$result = new SimpleXMLElement($xml_root, LIBXML_NOEMPTYTAG); 

可能做的伎倆。該文檔解釋這對於選項:

This option is currently just available in the DOMDocument::save 
and DOMDocument::saveXML functions. 
+0

該常數不能傳遞給Cox – Gordon

+0

Thx,Go​​rdon。我重申了我的答案。 – SteAp

+0

傳遞''作爲第二個參數不起作用。空白結果實際上是從數據庫中提取的。 –

4

你有幾個選項的選擇。

  1. 沒有空的元素。

    $result->addChild('deal'); // <deal/> 
    $result->addChild('deal', ''); // <deal></deal> 
    
  2. 使用LIBXML_NOEMPTYTAGdocs),這是不可用的SimpleXML(但很容易使用DOM與SimpleXML的對象)。

    $doc = dom_import_simplexml($result)->ownerDocument; 
    echo $doc->saveXML(NULL, LIBXML_NOEMPTYTAG); 
    
+0

演示鏈接http://codepad.org/NSujtZw6 – Gordon

0

有需要冗長的XML標籤很多,很多可能的原因。一種非常常見的情況是,當您使用PHP生成供iOS應用程序使用的屬性列表時。我遇到了最初問到的問題。

對於plists而言,看起來最好的解決方案是完全消除標籤以及其附帶的<key>元素。例如,以下所有導致「損壞的plist」錯誤在Xcode:

<key>someNumber</key> 
<integer /> 

<key>someNumber</key> 

<key>someNumber</key> 
<integer></integer> 

<key>someNumber</key> 
<integer> </integer> 

<key>someNumber</key> 
<integer>NULL</integer> 

唯一令允許的plist規範是完全消除了兩個元素。幸運的是,在Objective-C中,當檢索plist中不存在的鍵的objectForKey值時,結果只是一個空值,而不是一個錯誤。因此很容易在客戶端捕獲這種情況。

只要把它放在那裏,以防像我這樣的其他人(或未來我)遇到同樣的情況。

相關問題