awesomescorpion
awesomescorpion

Reputation: 65

SimpleXMLElement::__construct(): Entity: line 3: parser error : Start tag expected, '<' not found

working on a small xml project here using php. I am getting an error I do not understand. This is my situation: Using a log.xml, here is my logger code (first thing in index.php):

class logger{
    //declare variables
    private $logpath = "log.xml";
    private $logxml;

        //construct the logger
    function __construct(){
        $this->log("[this logger] starting...", __LINE__);
        //execute process
        $this->loadxml();

        $this->log("log XML file loaded", __LINE__);
        //return end result
        return $this;
    }

        //put a log line in the log file with it's file line
    public function log($log, $line){
        //execute process
        $xml = $this->loadxml();
        $root = new SimpleXMLElement($xml);//<--- line 27
        $newLog = $root.addChild("log");
        $newLog.addChild("text", $log);
        $newLog.addChild("line", $line);
        //memory management
        unset($xml);
        unset($root);
        //return end result
        return $newLog;
    }

        //reload xml
    public function loadxml(){
        //execute process
        $this->logxml = simplexml_load_file($this->logpath) or die("Error: Cannot load xml file: " . $this->logpath);
        //return end result
        return $this->logxml;
    }

        //logpath getter
    public function logpath(){
        return $this->logpath;
    }

        //logxml getter
    public function logxml(){
        return $this->logxml;
    }
}

Here is my log.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <log>
        <text>logtext example</text>
        <line>1</line>
    </log>
</root>

This is my exact error:

Warning: SimpleXMLElement::__construct(): Entity: line 3: parser error : Start tag expected, '<' not found in C:\xampp\htdocs\xmlproject\index.php on line 27

I do not understand what is going wrong. log.xml clearly has a start tag, <root>, which I try to access with $root. Yet it tells me that it cannot see a start tag. I am working in NetBeans 8.1. Can anybody be kind enough to tell me what is going wrong?

Upvotes: 0

Views: 2240

Answers (1)

alexander.polomodov
alexander.polomodov

Reputation: 5534

You have some errors into your code (below I show errors into public function log):

$xml = $this->loadxml(); // SimpleXMLElement already
$root = $xml; //new SimpleXMLElement($xml);//<--- line 27
$newLog = $root->addChild("log");
$newLog->addChild("text", $log);
$newLog->addChild("line", $line);

Full working code:

class logger{
    //declare variables
    private $logpath = "log.xml";
    private $logxml;

    //construct the logger
    function __construct(){
        $this->log("[this logger] starting...", __LINE__);
        //execute process
        $this->loadxml();

        $this->log("log XML file loaded", __LINE__);
        //return end result
        return $this;
    }

    //put a log line in the log file with it's file line
    public function log($log, $line){
        //execute process
        $xml = $this->loadxml(); // SimpleXMLElement already
        $root = $xml; //new SimpleXMLElement($xml);//<--- line 27
        $newLog = $root->addChild("log");
        $newLog->addChild("text", $log);
        $newLog->addChild("line", $line);
        //memory management
        unset($xml);
        unset($root);
        //return end result
        return $newLog;
    }

    //reload xml
    public function loadxml(){
        //execute process
        $this->logxml = simplexml_load_file($this->logpath) or die("Error: Cannot load xml file: " . $this->logpath);
        //return end result
        return $this->logxml;
    }

    //logpath getter
    public function logpath(){
        return $this->logpath;
    }

    //logxml getter
    public function logxml(){
        return $this->logxml;
    }
}

$logger = new logger();
var_dump($logger->logxml());

Output:

object(SimpleXMLElement)#2 (1) {
  ["log"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#3 (2) {
      ["text"]=>
      string(15) "logtext example"
      ["line"]=>
      string(1) "1"
    }
    [1]=>
    object(SimpleXMLElement)#4 (2) {
      ["text"]=>
      string(19) "log XML file loaded"
      ["line"]=>
      string(2) "14"
    }
  }
}

Upvotes: 1

Related Questions