0

複雑な XML 文書のパーサーを作成するDOMXPath場合、必要に応じてインスタンスを作成してもよいかどうか疑問に思います。

function parseData($d) {
    $xpath = new DOMXPath($d);
    // ...
}

function parseMoreData($d) {
    $xpath = new DOMXPath($d);
    // ...
}

$d = new DOMDocument();
$d->loadXML($xml);
parseData($d);
parseMoreData($d);

別の方法として、最初に 1 つのインスタンスを作成DOMXPathし、それをパーサーのあらゆる場所で再利用します。

function parseData($d, $xpath) {
    // ...
}

function parseMoreData($d, $xpath) {
    // ...
}

$d = new DOMDocument();
$d->loadXML($xml);
$xpath = new DOMXPath($d);
parseData($d, $xpath);
parseMoreData($d, $xpath);
4

2 に答える 2

0

1つのdomXpathを再構築しないため、代替案はもちろんより効率的です。ただし、ここで必要なオブジェクトは DomXPath だけであることに注意してください。ご覧のとおり、DOMXpath のコンストラクターは、指定した DOMDocument インスタンスにのみ依存します。したがって、関数がパラメーターとして DOMXpath のみを受け取る場合、それは同じになります。

を使用して、xpath のドキュメントにアクセスできます$xpath->document

次に、あなたが望むように、あなたが獲得するパフォーマンスはそれほど重要ではなく、わずか 252 バイトです。

かかる時間については、DOMXPath を開始するたびに解析時間が他の処理よりも重要になるため、大きなファイルを使用する場合にのみ重要になります。解決策は、ファクトリ パターンを使用することです。

class XPathFactory{
    private static instances=array();
    public static function getXPath($doc,$namespacePrefix){
        if(!isset(self::$instances[spl_object_hash($doc).$namespacePrefix]){
           self::$instances[spl_object_hash($doc).$namespacePrefix] = new DOMXPath($doc);
           self::$instances[spl_object_hash($doc).$namespacePrefix]->registerNamespace($namespacePrefix);
         }
         return self::$instances[spl_object_hash($doc).$namespacePrefix];
    }
 }

次に、関数で呼び出すだけです:

 XPathFactory::getXPath($doc,$namespace);

インスタンス化をあまり行わなくても、適切な XPath を取得できます。

于 2013-02-26T12:58:56.390 に答える