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またはXMLWriterCDATAして「ドライブ」し、それを適用する方法を知って、もう一度「自分の血を流す」必要があります。 ご覧のとおり、十分な時間を「殺す」だけで十分ですが、すぐに結果が必要になります。 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持つ配列が含まれている必要があります。 attributescontentおよび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を使用する価値はありますか?


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


参照資料




Source: https://habr.com/ru/post/J343636/


All Articles