PHP配列からのXML文字列コンストラクター

PHP開発者はどのくらいの頻度でXMLを使用しますか? 実際にはそれほど頻繁ではありません。 通常、BetaPRO、OnTime、CDEKなどのサードパーティサービスと統合する場合にニーズが発生します。 そして、ここでは、通常、コードが次のようになると状況が発生します。







$date = '2016-09-25T12:45:10'; $account = 'f62dcb094cc91617def72d9c260b4483'; $secure = '81ad561784277fa864bf644d755fb164'; $count = 1; $copy = 4; $dispatchNumber = '1033229706'; $orderDate = '2016-09-25T12:45:10'; $request = <<<XML <?xml version="1.0" encoding="UTF-8"?> <OrdersPrint Date="{$date}" Account="{$account}" Secure="{$secure}" OrderCount="{$count}" CopyCount="{$copy}"> <Order DispathNumber="{$orderNumber}" Date="{$orderDate}"/> </OrdersPrint> XML;
      
      





それだけではありません! 属性値とタグのコンテンツにXML固有の特殊文字が含まれないように注意する必要があります。 この特定のリクエストに対して、特殊文字がどれもここに到達しないことを確認できる場合、すべてのリクエストをまったく制御したくありません。 したがって、すべてが「フィルター」を通過します。 htmlspecialchars



またはCDATA



またはXMLWriter



CDATA



して「ドライブ」し、それを適用する方法を知って、もう一度「自分の血を流す」必要があります。 ご覧のとおり、十分な時間を「殺す」だけで十分ですが、すぐに結果が必要になります。 Eh ...そして、どのようにXMLをJSONのように高速に作成できるようにしたいのですか。配列を指定すると、XML文字列が得られ、問題はありません。 2015年に状況に悩まされ、私はそのようなデザイナーを作ることにしました。







この記事の公開時に、バージョン5.4から7.2のPHPのxml-constructorを紹介します。







使用する



開始するには、 Composerからこのパッケージをインストールします。







 $ composer require bupy7/xml-constructor
      
      





また、必要な場所に手動でコピーすることもできます。 パッケージには拡張子がありません。 PHP自体にlibxmlが存在することを除き、依存関係。







次に、PHP配列を使用してXML文字列を作成します。







 $date = '2016-09-25T12:45:10'; $account = 'f62dcb094cc91617def72d9c260b4483'; $secure = '81ad561784277fa864bf644d755fb164'; $count = 1; $copy = 4; $dispatchNumber = '1033229706'; $orderDate = '2016-09-25T12:45:10'; $in = [ [ 'tag' => 'OrdersPrint', 'attributes' => [ 'Date' => $date, 'Account' => $account, 'Secure' => $secure, 'OrderCount' => $count, 'CopyCount' => $copy, ], 'elements' => [ [ 'tag' => 'Order', 'attributes' => [ 'DispathNumber' => $dispatchNumber, 'Date' => $orderDate, ], ], ], ], ]; $request = (new \bupy7\xml\constructor\XmlConstructor())->fromArray($in)->toOutput();
      
      





結果:







 <?xml version="1.0" encoding="UTF-8"?> <OrdersPrint Date="2016-09-25T12:45:10" Account="f62dcb094cc91617def72d9c260b4483" Secure="81ad561784277fa864bf644d755fb164" OrderCount="1" CopyCount="4"> <Order DispathNumber="1033229706" Date="2016-09-25T12:45:10"/> </OrdersPrint>
      
      





それがすべての作業です! 残りはxml-constructor



によってxml-constructor



ます。







そして、値に「禁止」されたものを渡し、 xml-constructor



がどのように動作するかを見てみましょう。







 $date = '2016-09-25T12:45:10'; $secure = '81ad561784277fa864bf644d755fb164'; $count = 1; $copy = 4; $dispatchNumber = '1033229706'; $orderDate = '2016-09-25T12:45:10'; // ACHTUNG !!! $account = '<example danger="account"><WTF?!/></example>'; $orderContent = '<special>"chars"'; $in = [ [ 'tag' => 'OrdersPrint', 'attributes' => [ 'Date' => $date, 'Account' => $account, 'Secure' => $secure, 'OrderCount' => $count, 'CopyCount' => $copy, ], 'elements' => [ [ 'tag' => 'Order', 'attributes' => [ 'DispathNumber' => $dispatchNumber, 'Date' => $orderDate, ], 'content' => $orderContent, ], ], ], ]; $request = (new \bupy7\xml\constructor\XmlConstructor())->fromArray($in)->toOutput();
      
      





結果:







 <?xml version="1.0" encoding="UTF-8"?> <OrdersPrint Date="2016-09-25T12:45:10" Account="&lt;example danger=&quot;account&quot;&gt;&lt;WTF?!/&gt;&lt;/example&gt;" Secure="81ad561784277fa864bf644d755fb164" OrderCount="1" CopyCount="4"> <Order DispathNumber="1033229706" Date="2016-09-25T12:45:10">&lt;special&gt;&quot;chars&quot;</Order> </OrdersPrint>
      
      





必要条件



XML文字列を作成すると、正しいキーと正しい構造でPHP配列を渡すことになります。 次の4つのキーのみがあります。









配列の各要素には、少なくとも1つのtag



持つ配列が含まれている必要があります。 attributes



content



およびelements



キーはオプションです。







ネストの最初のレベルは、XMLドキュメントのルートに他なりません。







 $in = [ [ 'tag' => 'FirstRoot', ], [ 'tag' => 'SecondRoot', 'content' => 'Content of SecondRoot', ], ]; $request = (new \bupy7\xml\constructor\XmlConstructor())->fromArray($in)->toOutput();
      
      





結果:







 <?xml version="1.0" encoding="UTF-8"?> <FirstRoot/> <SecondRoot>Content of SecondRoot</SecondRoot>
      
      





構成



構成から、すべてが最も必要なだけです。









構成を適用するには、最初の引数でキーと値の配列をコンストラクターに渡す必要があります。







 $date = '2016-09-25T12:45:10'; $account = 'f62dcb094cc91617def72d9c260b4483'; $secure = '81ad561784277fa864bf644d755fb164'; $count = 1; $copy = 4; $dispatchNumber = '1033229706'; $orderDate = '2016-09-25T12:45:10'; $in = [ [ 'tag' => 'OrdersPrint', 'attributes' => [ 'Date' => $date, 'Account' => $account, 'Secure' => $secure, 'OrderCount' => $count, 'CopyCount' => $copy, ], 'elements' => [ [ 'tag' => 'Order', 'attributes' => [ 'DispathNumber' => $dispatchNumber, 'Date' => $orderDate, ], ], ], ], ]; $request = (new \bupy7\xml\constructor\XmlConstructor([ 'indentString' => '****', 'startDocument' => false, ])) ->fromArray($in) ->toOutput();
      
      





結果:







 <OrdersPrint Date="2016-09-25T12:45:10" Account="f62dcb094cc91617def72d9c260b4483" Secure="81ad561784277fa864bf644d755fb164" OrderCount="1" CopyCount="4"><Order DispathNumber="1033229706" Date="2016-09-25T12:45:10"/></OrdersPrint>
      
      





おわりに



拡張機能は非常にシンプルで、APIにXMLを使用するサービスと統合する際に非常に便利です。 xml-constructor



を使用する価値はありますか?







時間を読んでくれてありがとう!







参照資料






All Articles