2013-10-22 62 views
1

我使用捲曲發送下面的XML的API:避免在PHP中硬編碼XML的API請求

$xml = "<request type='auth' timestamp='$timestamp'> 
       <merchantid>$merchantid</merchantid> 
       <account>$account</account> 
       <orderid>$orderid</orderid> 
       <amount currency='$currency'>$amount</amount> 
       <card> 
        <number>$cardnumber</number> 
        <expdate>$expdate</expdate> 
        <type>$cardtype</type> 
        <chname>$cardname</chname> 

       </card> 
       <sha1hash>$sha1hash</sha1hash> 
      </request>"; 

什麼是避免硬編碼這個XML的最佳方式?我正在考慮使用XMLWriter,但似乎很奇怪,因爲它不會改變。

我應該使用模板嗎?或者使用XMLWriter/Simple XML生成它?

+2

你有選擇,對此沒有一個正確的答案:'XMLwriter','SimpleXML','DOMDocument'或甚至只是你自己的'String Appender。='! – MackieeE

+0

你會推薦哪一個? – paul

+0

@MackieeE:字符串appender不是真正的選擇我會說,因爲這經常會產生編碼問題。 – hakre

回答

2

正如我在評論中提到的,這不一定是正確的答案,但我最近還不得不圍繞XML API Feed編寫項目。我決定去與XMLWriter,它仍然非常容易通過使用其受尊重的.loadXML()函數輕鬆地交換到其他人。

class SomeApi extends XMLwriter { 

    public function __construct() { 
     $this->openMemory(); 
     $this->setIndent(true); 
     $this->setIndentString ("&#09;"); 
     $this->startDocument('1.0', 'UTF-8', 'no'); 
     $this->startElement('root'); 
    } 

    public function addNode($Name, $Contents) { 
     $this->startElement($Name); 
      $this->writeCData($Contents); 
     $this->endElement(); 
    } 

    public function output() { 
     $this->endElement(); 
     $this->endDocument(); 
    } 

    //Returns a String of Xml. 
    public function render() { 
     return $this->outputMemory(); 
    } 

} 

$newRequest = new SomeApi(); 
$newRequest->addNode('some', 'Some Lots of Text'); 
$Xml = $newRequest->render(); 

我認爲這是一個乾淨的方式寫在PHP的XML飼料,此外,你可以添加內部功能,如:

$this->addHeader(); 

private function addHeader() { 
    $this->addNode('login', 'xxxxx'); 
    $this->addNode('password', 'xxxxx'); 
} 

,然後追加,你會在&在使用節點再次。然後,如果你突然需要使用一個DOMDocument對象(因爲我也需要XSL)。

$Dom = new DOMDocument(); 
$Dom->loadXML($Xml); 
+0

寫CDATA?爲了那個原因?最有可能完成膨脹,我想知道你爲什麼這麼建議。另外爲什麼你隱藏了在API名稱後面創建XML的責任? XML最有可能用於協議層與遠程端點進行通信。 – hakre

0

我應該使用模板嗎?

你其實已經在這裏使用了一個模板。

或者使用XMLWriter/Simple XML生成它?

XMLWriter還有SimpleXMLElement是允許您輕鬆創建XML的組件。對於您的具體情況,我會使用SimpleXML作爲開始:

$xml = new SimpleXMLElement('<request type="auth"/>'); 
$xml['timestamp'] = $timestamp; 

$xml->merchantid = $merchantid; 
$xml->account = $account; 
$xml->orderid = $orderid; 
$xml->addChild('amount', $amount)['currency'] = $currency; 

$card = $xml->addChild('card'); 
$card->number = $cardnumber; 
$card->expdate = $expdate; 
$card->type = $cardtype; 
$card->chname = $cardname; 

$xml->sha1hash = $sha1hash; 

請參閱XML不再硬編碼,只有使用的名稱是。該SimpleXML的庫負責創建XML(demo,這裏的輸出被美化爲更好的可讀性):

<?xml version="1.0"?> 
<request type="auth" timestamp=""> 
    <merchantid></merchantid> 
    <account></account> 
    <orderid></orderid> 
    <amount currency=""/> 
    <card> 
    <number></number> 
    <expdate></expdate> 
    <type></type> 
    <chname></chname> 
    </card> 
    <sha1hash></sha1hash> 
</request> 

由於庫,輸出始終是有效的XML,你不需要關心細節在這裏。你可以通過更多地包裝來進一步簡化它,但是我認爲這對你在這裏使用的非常少的XML沒有多大用處。

+0

@Phpdna:對用戶的回答或投票進行投票是有區別的。你不應該這樣做。 – hakre

+0

謝謝,在XMLWriter上使用SimpleXML有什麼主要優勢嗎?我不確定使用哪一個。 – paul

+1

您創建的XML塊有多大?如果是這樣的話,你可以在這裏看到答案中的代碼示例,我會說SimpleXML非常適合你的案例。 XMLWriter的接口不是那麼緊湊,也不是那種模塊化的。 DOMDocument是另一種選擇,但它的界面更加模塊化,因爲SimpleXML也更加冗長,所以我認爲從這裏開始使用SimpleXML是一個不錯的入口。 – hakre