如何使用DomDocument :: loadXML()获取解析错误

时间:2014-10-15 06:57:46

标签: php domdocument

我正在尝试加载具有不匹配标签的xml,我希望这样的东西可以工作但没有运气。

try{
   $xml=new \DOMDocument('1.0','utf-8');
   $xml->loadXML(file_get_contents($file),
}catch (\Exception $e){
    echo $e->getMessage());        
}

现在我真的需要为解析错误抛出异常。我试图将options传递给loadXML

LIBXML_ERR_ERROR|LIBXML_ERR_FATAL|LIBXML_ERR_WARNING
再一次没有运气。请指导我如何捕获所有这些解析错误。

修改

正如@Ghost在评论中所建议的那样,我解决了这个问题

abstract class XmlReadStrategy extends AbstractReadStrategy
{

    /** @var  array */
    protected $importAttributes;

    /**
     * @param $fileFullPath
     * @param $fileName
     */
    public function __construct($fileFullPath,$fileName)
    {
        parent::__construct($fileFullPath,$fileName);
        libxml_use_internal_errors(true);
    }

    /**
     *
     */
    protected function handleXmlException(){
       $this->dataSrc=array();
       foreach(libxml_get_errors() as $e){
           $this->logger->append(Logger::ERROR,'[Error] '.$e->message);
       }
    }

    /**
     * Import xml file
     * @param string $file
     * @throws \Exception
     */
    protected function loadImportFileData($file)
    {
        try{
            $xml=new \DOMDocument('1.0','utf-8');
            if(!$xml->loadXML(file_get_contents($file))){
                $this->handleXmlException();
            }
            $this->dataSrc=$this->nodeFilter($xml);
        }catch (\Exception $e){
            $this->logger->append(Logger::ERROR,$e->getMessage());
            $this->dataSrc=array();
        }
    }

 ....
}

所以诀窍是调用libxml_use_internal_errors(true);然后检查loadXML()状态,例如

if(!$xml->loadXML(file_get_contents($file))){
   $this->handleXmlException();
 }

我不知道此libxml_use_internal_errors(true);到目前为止是否有任何副作用

1 个答案:

答案 0 :(得分:3)

您可以启用libxml_use_internal_errors并使用libxml_get_errors()

获取错误
  libxml_use_internal_errors(true);
  $xml = new DOMDocument('1.0','utf-8');

  if ( !$xml->loadxml(file_get_contents($file)) ) {
    $errors = libxml_get_errors();
    var_dump($errors);
  }