XMLコンパイルエラーのエラーメッセージの改善


14

Magentoは、エラーの表示に関しては(あるべきところに)かなり保護的です。開発者モードが有効になっている場合(開発中にそうであるように)、アプリケーションはランタイムエラーフィードバックをユーザーにバブルアップさせます。XMLコンパイルエラーの場合、このフィードバックはほとんど役に立ちません。

致命的エラー:メッセージ「警告:simplexml_load_string():エンティティ:行4:パーサーエラー:[...] / lib / Varien / Simplexml / Configのドキュメントの先頭でのみ許可されるXML宣言」でキャッチされない例外「例外」。 [...] app / code / core / Mage / Core / functions.phpの245行目にある510行目のphp

これは、解析できない文字列をVarien_Simplexml_Config::loadFile()表示::loadString()した結果です。

public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    return $this->loadString($fileData, $this->_elementClass);
}

使用を含む、いくつかの潜在的なソリューションがあります libxml_use_internal_errorsが、呼び出し元のメソッドは$filePathパラメーターを通信しないため、コンテキストが失われます。1つの可能性は、より明示的な例外をスローすることです。

public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    try{
        return $this->loadString($fileData, $this->_elementClass);
    }
    catch (Exception $e){
        Mage::throwException (
            sprintf(
                "%s: error parsing %s:\r\n%s",
                __METHOD__,
                $filePath,
                $e->getMessage()
            )
        );
    }
}

これにより、少なくとも次のような出力が提供されます。

致命的なエラー:メッセージ ' Varien_Simplexml_Config :: loadFile:[...] / app / code / local / Some / Example / etc / config.xmlの解析中にエラーが発生し、キャッチされていない例外' Mage_Core_Exception ':警告:simplexml_load_string():エンティティ:行4 :パーサーエラー:XML宣言は、[...] / app / Mage.phpの594行目の[...] / lib / Varien / Simplexml / Config.phpの534行目のドキュメントの先頭でのみ許可されています

ここで考慮すべき利点/欠点/代替アプローチはありますか?


これらの悪いコアエラーメッセージのいくつかを改善するコミュニティモジュールは壮大だと思います。本当に悪い他のエラーメッセージは、特定のphtmlが見つからない場合です。
kalenjordan

回答:


14

私がいつも取っているアプローチは、シンプルなワンライナーです。

find . -type f -name '*.xml' -exec xmllint --noout {} \;

ただし、libxml2-utilsが必要です...


1
wsiファイルに誤検知が表示されます。– namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
アレックス

回避策:(find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;回答を自由に編集してください)
アレックス

config.xmlの場合:私はファンですfind . -type f -name 'config.xml' -exec xmllint --noout {} \;
-benmarks

@アレックス私は同じエラーを取得しています、あなたはそれを修正していますか?
バタフライ

私が投稿した行を試してみましたか?
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.