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="<example danger="account"><WTF?!/></example>" Secure="81ad561784277fa864bf644d755fb164" OrderCount="1" CopyCount="4"> <Order DispathNumber="1033229706" Date="2016-09-25T12:45:10"><special>"chars"</Order> </OrdersPrint>
必要条件
XML文字列を作成すると、正しいキーと正しい構造でPHP配列を渡すことになります。 次の4つのキーのみがあります。
-
tag
タグ名を含む文字列。 -
content
タグで囲まれたコンテンツ。 -
attributes
キーと値の配列。キーはthis、属性の名前(文字列)、値はその値(文字列)です。 -
elements
このキーが指定されたタグの新しいネスト。 また、上記のすべての要素が含まれます。 ネストは無制限です。
配列の各要素には、少なくとも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>
構成
構成から、すべてが最も必要なだけです。
-
indentString
インデント用の任意の行。 デフォルトは4スペースです。 インデントをまったく使用しない場合は、false
渡しfalse
。 -
startDocument
ドキュメントのXML宣言の属性を持つキーと値の配列。 デフォルトでは、これは<?xml version="1.0" encoding="UTF-8"?>
です。 宣言が必要ない場合は、false
渡しfalse
。
構成を適用するには、最初の引数でキーと値の配列をコンストラクターに渡す必要があります。
$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
を使用する価値はありますか?
時間を読んでくれてありがとう!