5

私はこのエラーで立ち往生しました:

Warning: simplexml_load_string(): Entity: line 46: parser error : Comment not terminated  in */lib/Varien/Simplexml/Config.php on line 510

Entity: line 46: parser error : Start tag expected, '<' not found  in */lib/Varien/Simplexml/Config.php on line 510

一部の Xml ファイルに問題があることは明らかですが、大きな干し草の山から針を見つけるのは簡単ではありません :)

そのための良い習慣はありますか?可能であれば、Xdebug やログを使用する良い方法を見つけたいと思います。

Magento では、スペルミスをすることがよくあります。

4

6 に答える 6

16

この記事のDealing with XML errors をご覧になることができると思います。

この警告はいくつかの config.xml エラーに関連しているため、正確なファイルを見つけるための可能な回避策は mod. /lib/Varien/Simplexml/Config.php クラス。

メソッドを変更する必要がありますVarien_Simplexml_Config::loadString()

public function loadString($string)
{
    if (is_string($string)) {
        // Enable internal errors
        libxml_use_internal_errors(true);
        $xml = simplexml_load_string($string, $this->_elementClass);
        if (false === $xml) {
            // Put breakpoint here
            $errors = libxml_get_errors();
        }
        if ($xml instanceof Varien_Simplexml_Element) {
            $this->_xml = $xml;
            return true;
        }
    } else {
        Mage::logException(new Exception('"$string" parameter for simplexml_load_string is not a string'));
    }
    return false;
}

エラーがいくつかのレイアウト ファイルに関連している場合 (Update.php 行 444 警告)

Mage_Core_Model_Layout_Update::getFileLayoutUpdatesXml()同様の方法でメソッドを変更する必要があります。

public function getFileLayoutUpdatesXml($area, $package, $theme, $storeId = null)
{
    if (null === $storeId) {
        $storeId = Mage::app()->getStore()->getId();
    }
    /* @var $design Mage_Core_Model_Design_Package */
    $design = Mage::getSingleton('core/design_package');
    $layoutXml = null;
    $elementClass = $this->getElementClass();
    $updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates');
    Mage::dispatchEvent('core_layout_update_updates_get_after', array('updates' => $updatesRoot));
    $updateFiles = array();
    foreach ($updatesRoot->children() as $updateNode) {
        if ($updateNode->file) {
            $module = $updateNode->getAttribute('module');
            if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module, $storeId)) {
                continue;
            }
            $updateFiles[] = (string)$updateNode->file;
        }
    }
    // custom local layout updates file - load always last
    $updateFiles[] = 'local.xml';
    $layoutStr = '';
    foreach ($updateFiles as $file) {
        $filename = $design->getLayoutFilename($file, array(
            '_area'    => $area,
            '_package' => $package,
            '_theme'   => $theme
        ));
        if (!is_readable($filename)) {
            continue;
        }
        $fileStr = file_get_contents($filename);
        $fileStr = str_replace($this->_subst['from'], $this->_subst['to'], $fileStr);   


        libxml_use_internal_errors(true);
        $fileXml = simplexml_load_string($fileStr, $elementClass);


        if (false === $fileXml) {
            // Put breakpoint here
            $errors = libxml_get_errors();
            $err = array($filename, $errors);
            // error detail and file name will be printed
            Zend_Debug::dump($err);
            die();
        }



        if (!$fileXml instanceof SimpleXMLElement) {
            continue;
        }
        $layoutStr .= $fileXml->innerXml();
    }
    $layoutXml = simplexml_load_string('<layouts>'.$layoutStr.'</layouts>', $elementClass);
    return $layoutXml;
}

ページをリロードして、エラー情報を読んでください。

于 2012-10-31T07:14:20.000 に答える
4

よく検索した後、$stringすべての CML がマージされた場合、どのタグが閉じられていないかを見つける機会はほとんどありません。

クラス /lib/Varien/Simplexml/Config.php で、次のメソッドを変更する必要があります。

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);
    //add this try catch
    try{
        $this->loadString($fileData, $this->_elementClass);
    } catch (Exception $e) {
        var_dump("The error: " . $e->getMessage());
        var_dump("The bad file" . $filePath);
    }

    return $this->loadString($fileData, $this->_elementClass);
}

このようにして、どのファイルに不正なタグが付いているかを確認できます。

于 2013-11-01T06:51:54.020 に答える
2

ファイル app/code/core/Mage/Core/Model/Layout/Update.php を編集し、関数「getFileLayoutUpdatesXml」を検索します。

追加:

Mage::log(print_r($filename, true));

ほぼ 442 行目、前:

$fileStr = file_get_contents($filename);
于 2014-03-11T21:35:34.153 に答える
2

テスト環境が Linux の場合は、レイアウト xml ファイルに変更を加えた後、XMLLint を使用xmllintしてレイアウト xml ファイルの不整合をチェックすることもできます。実装前にチェックすることで、多くの罪を発見し、エラーがスローされるのを防ぎます。

于 2013-06-20T13:57:42.290 に答える
1

そのケースを解決するには、同じファイルの */lib/Varien/Simplexml/Config.php の #489 行目に

読み込んだ XML ファイルの出力パスをZend_Debug::dump($filePath);後に配置$fileData = $this->processFileData($fileData);

関数 loadString($string) を上書きします


if (is_string($string)) {
    $xml = simplexml_load_string($string, $this->_elementClass);
    if ($xml instanceof Varien_Simplexml_Element) {
        $this->_xml = $xml;
        return true;
    }
} else {
    Mage::logException(new Exception('"$string" parameter for simplexml_load_string is not a string'));
}
return false;

と置換する

if (is_string($string)) {
    // Enable internal errors
    //Mage::log($string);
    libxml_use_internal_errors(true);
    $xml = simplexml_load_string($string, $this->_elementClass);

    if (false === $xml) {
        // Put breakpoint here
        $errors = libxml_get_errors();
        $err = array($errors);
        // error detail and file name will be printed
        Zend_Debug::dump($string);;
        Zend_Debug::dump($err);
        die();
    }
    if ($xml instanceof Varien_Simplexml_Element) {
        $this->_xml = $xml;
        return true;
    }
} else {
    Mage::logException(new Exception('"$string" parameter for simplexml_load_string is not a string'));
}
return false;

これにより、問題が発生するパスとエラーが出力されます。

于 2016-04-28T04:19:20.383 に答える
0

*/lib/Varien/Simplexml/Config.php on line 510

行ってデバッグ行を追加し、ロードしようとする xml をエコーアウトして、この文字列の何が問題なのかを確認します。

于 2012-10-31T07:13:48.920 に答える