如何轻松调试布局Xml警告/错误?
我被这个错误卡住了:如何轻松调试布局Xml警告/错误?,xml,debugging,magento,xdebug,Xml,Debugging,Magento,Xdebug,我被这个错误卡住了: Warning: simplexml_load_string(): Entity: line 46: parser error : Comment not terminated in */lib/Varien/Simplexml/Config.php on line 510 及 很明显,某些Xml文件中存在一个问题,但对我来说,要找到大海捞针实在不容易:) 有什么好的做法吗? 如果可能的话,我想找到一个使用Xdebug或一些日志的好方法 在Magento经常会出现拼写错
Warning: simplexml_load_string(): Entity: line 46: parser error : Comment not terminated in */lib/Varien/Simplexml/Config.php on line 510
及
很明显,某些Xml文件中存在一个问题,但对我来说,要找到大海捞针实在不容易:)
有什么好的做法吗?
如果可能的话,我想找到一个使用Xdebug或一些日志的好方法
在Magento经常会出现拼写错误。在
*/lib/Varien/Simplexml/Config.php on line 510
去添加一个调试行,回显它试图加载的xml,看看这个字符串有什么问题。我想你可以看看这篇文章 此警告与某个config.xml错误有关,因此找到确切文件的可能解决方法是修改。/lib/Varien/Simplexml/Config.php类 您应该修改
Varien\u Simplexml\u Config::loadString()
方法:
公共函数加载字符串($string)
{
如果(是字符串($string)){
//启用内部错误
libxml\u使用\u内部错误(true);
$xml=simplexml\u load\u string($string,$this->\u elementClass);
if(false==$xml){
//把断点放在这里
$errors=libxml_get_errors();
}
if($Varien\u Simplexml\u元素的xml实例){
$this->_xml=$xml;
返回true;
}
}否则{
Mage::logException(新异常(“$string”参数用于simplexml_load_string不是字符串”);
}
返回false;
}
如果错误与某个布局文件有关(Update.php第444行警告)
您应该以类似的方式修改Mage\u Core\u Model\u Layout\u Update::getFileLayoutUpdatesXml()
方法:
公共函数getFileLayoutUpdatesXml($area、$package、$theme、$storeId=null)
{
如果(null==$storeId){
$storeId=Mage::app()->getStore()->getId();
}
/*@var$design Mage\u Core\u Model\u design\u包*/
$design=Mage::getSingleton('core/design_-package');
$layoutXml=null;
$elementClass=$this->getElementClass();
$updateroot=Mage::app()->getConfig()->getNode($area.'/layout/updates');
Mage::dispatchEvent('core\u layout\u updates\u get\u after',array('updates'=>$updatesRoot));
$updateFiles=array();
foreach($updateRoot->children()作为$updateNode){
如果($updateNode->file){
$module=$updateNode->getAttribute('module');
if($module&&Mage::getStoreConfigFlag('advanced/modules\u disable\u output/'。$module,$storeId)){
继续;
}
$updateFiles[]=(字符串)$updateNode->file;
}
}
//自定义本地布局更新文件-始终最后加载
$updateFiles[]=“local.xml”;
$layoutStr='';
foreach($updateFiles作为$file){
$filename=$design->getLayoutFilename($file,array)(
“_area”=>$area,
“_package”=>$package,
“_theme”=>$theme
));
如果(!是否可读($filename)){
继续;
}
$fileStr=文件获取内容($filename);
$fileStr=str_replace($this->_subst['from'],$this->_subst['to'],$fileStr);
libxml\u使用\u内部错误(true);
$fileXml=simplexml\u load\u字符串($fileStr,$elementClass);
if(false==$fileXml){
//把断点放在这里
$errors=libxml_get_errors();
$err=array($filename,$errors);
//将打印错误详细信息和文件名
Zend_Debug::dump($err);
模具();
}
if(!$fileXml instanceof simplexmlement){
继续;
}
$layoutStr.=$fileXml->innerXml();
}
$layoutXml=simplexml_load_字符串(“.$layoutStr.”,$elementClass);
返回$layoutXml;
}
现在只需重新加载页面并读取错误信息。如果您的测试环境是Linux,您还可以在对布局xml文件进行更改后使用XMLLint
XMLLint
检查布局xml文件是否不一致。在实现之前进行检查可以发现大量的SIN,并防止抛出错误。好吧,在经过良好的搜索之后,如果$string
是所有CML合并的,那么您几乎没有机会找到哪个标记是坏关闭的
我找到了一种方法,在类/lib/Varien/Simplexml/Config.php中,您必须修改下一个方法:
公共函数加载文件($filePath)
{
如果(!是可读的($filePath)){
//引发新异常('无法读取xml文件'.$filePath');
返回false;
}
$fileData=file\u get\u contents($filePath);
$fileData=$this->processFileData($fileData);
//添加此尝试捕获
试一试{
$this->loadString($fileData,$this->\u elementClass);
}捕获(例外$e){
var_dump(“错误:“.$e->getMessage());
var_dump(“坏文件”。$filePath);
}
返回$this->loadString($fileData,$this->\u elementClass);
}
通过这种方式,我们现在可以看到哪个文件的标签不正确。编辑文件app/code/core/Mage/core/Model/Layout/Update.php并搜索函数“getFileLayoutUpdatesXml” 加: 大约在第442行,在:
$fileStr = file_get_contents($filename);
为了解决这个问题,在第489行的同一个文件*/lib/Varien/Simplexml/Config.php中 加载的XML文件的打印路径put
Zend_Debug::dump($filePath)
在$fileData=$this->processFileData($fileData)之后代码>
并覆盖函数loadString($string)
if(是字符串($string)){
$xml=simplexml\u load\u string($string,$this->\u elementClass);
if($Varien\u Simplexml\u元素的xml实例){
$this->_xml=$xml;
返回true;
}
}否则{
Mage::logException(新异常(“$string”参数用于simplexml_load_string不是字符串”);
}
返回false;
取代
if(是字符串($string)){
//启用内部错误
//Mage::log($string);
libxml\u使用\u内部错误(true);
$xml=simplexml\u load\u string($string,$this->\u elementClass);
如果(false)=$xm
Mage::log(print_r($filename, true));
$fileStr = file_get_contents($filename);