2014-10-15 7 views
5

Ich versuche, XML zu laden, die nicht übereinstimmende Tags hat und ich erwartet, dass etwas wie das funktioniert, aber ohne Glück.Wie bekomme ich Parse-Fehler mit DomDocument :: loadXML()

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

Jetzt brauche ich wirklich eine Ausnahme für Parse-Fehler zu werfen. Ich habe versucht, options passieren

LIBXML_ERR_ERROR|LIBXML_ERR_FATAL|LIBXML_ERR_WARNING 

wieder kein Glück LoadXML. Bitte führen Sie mich, wie Sie alle diese Parse-Fehler abfangen können.

bearbeiten

Wie in den Kommentaren von @Ghost vorgeschlagen, ich kam um diese Lösung

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(); 
     } 
    } 

.... 
} 

Also der Trick libxml_use_internal_errors(true); rufen und dann loadXML überprüfen() Status zB

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

Ich weiß nicht, ob diese libxml_use_internal_errors(true); bisher eine Nebenwirkung hat

+0

möglicherweise bezogen http://stackoverflow.com/questions/10025247/libxml-error-handler-with-oop – Ghost

+0

dank @Ghost :) – sakhunzai

+0

sicher Mann bekommen keine wahrscheinlich – Ghost

Antwort

2

Sie können libxml_use_internal_errors ermöglichen und Fehler mit 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); 
    }