避免在PHP中使用XML对XML请求进行硬编码

时间:2013-10-22 12:13:40

标签: php xml api

我正在使用cURL将以下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 个答案:

答案 0 :(得分: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 Feed是一种很好的清洁方式,而且还可以添加内部函数,例如:

$this->addHeader();

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

然后添加您将使用的节点&amp;再次。然后,如果您突然需要使用DOMDocument对象(例如我也需要XSL)。

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

答案 1 :(得分: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有很大用处。