1

我正在使用 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 生成它?

4

2 回答 2

2

正如我在评论中提到的,这不一定是正确的答案,但我最近也不得不围绕 XML API 提要编写一个项目。我决定继续使用,通过使用他们受人尊敬的功能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 );
于 2013-10-22T12:33:19.347 回答
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(演示,这里的输出被美化以提高可读性):

<?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 没有多大用处。

于 2013-10-22T21:48:05.373 回答