2011-11-23 53 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值时,结果只是一个空值,而不是一个错误。因此很容易在客户端捕获这种情况。

只要把它放在那里,以防像我这样的其他人(或未来我)遇到同样的情况。