2

私はこの質問/回答を読みましたが、それが「悪い考え」であるという言及はありませんでした。残念ながら、parsexml、およびphpという単語を含む検索クエリは、通常、PHP を使用した XML の解析に関する情報を生成します ( SimpleXMLなどを介して) 。

短い質問- PHP を XML に埋め込み、条件付きで抽出 (および実行) することは実行可能な解決策でしょうか。

拡張-- おそらく、この問題は XML とはあまり関係がなく、適切な「メタ言語」を選択することに関係しています。これに対して、クエリを実行して条件を満たし、含まれている PHP スニペットを実行できます。XML は、その構造、移植性、および単純さ (冗長性にもかかわらず)の優れた候補のように思え
ました。データ構造として配列を使用して、単純な PHP にフォールバックすることを検討しましたが、構造化されたメタ言語であればラッパーとして十分です。このようなタスクに適した言語の提案は大歓迎です。

とにかく、私は PHP が埋め込まれた XML ファイルを受け入れるエンジンに取り組んできました。XML データを解析し (私の場合は SAX コールバックを使用)、XML データの「クエリ」を支援する入力に応じて、適切な埋め込み PHP を取得して実行しeval()ます。

私は知っています;「eval()答えが である場合、あなたはほぼ間違いなく間違った質問をしている.」しかし、私は現時点ではそれについて心配していません

だから私は次のようなものになります:

<root>
    <node>
        <parameters>
            <!-- some stuff -->
        </parameters>
        <callback>
            <?php
                function(){
                    // do some stuff
                };
            ?>
        </callback>
    </node>
    <node>
        <parameters>
            <!-- some other stuff -->
        </parameters>
        <callback>
            <?php
                function(){
                    // do some other stuff
                };
            ?>
        </callback>
    </node>
</root>

xml_set_processing_instruction_handler()最終的に行うコールバックを設定することで、PHP を解析できます。

xml_set_processing_instruction_handler($parser, function($parser, $target, $func)
    {
        // obtain some parameters into $data
        call_user_func(eval("return {$func};"), $data);
    });

コードは単なる例です。もちろん、ここではさらに多くのことが行われています

このアプローチを試みた結果、予期しないエッジ ケースが原因で失敗しましたか? このようなパーサーに多くの時間を費やして、状況によっては見事に失敗することを知りたくはありません。私は自分の過ちから学ぶことができてうれしいですが、他の人の過ちから学ぶほうがずっとましです。

4

2 に答える 2

1

これは、 AdhocTaskを CDATA として宣言し、その中でコードを実行するという Phing のカスタム アプローチよりも優れたアプローチのようです。ソースコードでは、単に要素の内容を評価していることに注意してください。

xml_set_processing_instruction_handler() のドキュメントに、「PI 終了タグ (?>) を引用することはできません」という注意事項が記載されています。これは、次の場合に問題が発生することを意味します。

<callback>
    <?php
        function() {
            return '?>';
        };
    ?>
</callback>

これは非常に簡単に回避できます。

<callback>
    <?php
        function() {
            return '?' . '>';
        };
    ?>
</callback>

それ以外は、通常の eval() の予防策を講じている限り、問題ないはずです!

于 2011-12-24T16:27:18.553 に答える
0

「XSLT に埋め込まれた PHP の解析」の使用法を理解するには、この registerPHPFunctions のチュートリアルを参照してください。

「PHP から XML へ」の使用を理解するには(通常の PHP の「HTML へ」の使用と同様)、http://code.google.com/p/smallest-php-xml-xsl-framework/を参照してください   。これは XML を使用したアプリケーションです。 +PHP (PHP 生成 XML) およびオプションのテンプレート システムとしての XSLT。MVC アーキテクチャでは、XML+PHP が「MVC モデル処理」を実行し、XSLT が MVC ビュー (またはオプションでビューとして PHP コードを直接使用) を実行します。

于 2012-07-25T12:03:00.993 に答える