Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何轻松调试布局Xml警告/错误?_Xml_Debugging_Magento_Xdebug - Fatal编程技术网

如何轻松调试布局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);