Если я пытаюсь загрузить HTML-документ в PHP DOM, я получаю сообщение об ошибке:
Error DOMDocument::loadHTML() [domdocument.loadhtml]: ID someAnchor already defined in Entity, line: 9
Я не могу понять, почему. Вот некоторый код, который загружает строку HTML в DOM.
Сначала без тега привязки, а затем с одним. Второй документ выдает ошибку.
Надеюсь, вы сможете вырезать и вставить его в скрипт и запустить его, чтобы увидеть тот же результат:
<code><?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$stringWithNoAnchor = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body >
<h1>Hello</h1>
</body>
</html>
EOT;
$stringWithAnchor = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body >
<h1>Hello</h1>
<a name="someAnchor" id="someAnchor"></a>
</body>
</html>
EOT;
class domGrabber
{
public $_FileErrorStr = '';
/**
*@desc DOM object factory does the work of loading the DOM object
*/
public function getLoadAsDOMObj($htmlString)
{
$this->_FileErrorStr =''; //reset error container
$xmlDoc = new DOMDocument();
set_error_handler(array($this, '_FileErrorHandler')); // Warnings and errors are suppressed
$xmlDoc->loadHTML($htmlString);
restore_error_handler();
return $xmlDoc;
}
/**
*@desc public so that it can catch errors from outside this class
*/
public function _FileErrorHandler($errno, $errstr, $errfile, $errline)
{
if ($this->_FileErrorStr === null)
{
$this->_FileErrorStr = $errstr;
}
else {
$this->_FileErrorStr .= (PHP_EOL . $errstr);
}
}
}
$domGrabber = new domGrabber();
$xmlDoc = $domGrabber->getLoadAsDOMObj($stringWithNoAnchor );
echo 'PHP Version: '. phpversion() .'<br />'."\n";
echo '<pre>';
print $xmlDoc->saveXML();
echo '
"\ п".
if ($ domGrabber -> _ FileErrorStr)
{
эхо «Ошибка». $ DomGrabber -> _ FileErrorStr;
}
$ xmlDoc = $ domGrabber-> getLoadAsDOMObj ($ stringWithAnchor);
echo '
';
print $xmlDoc->saveXML();
echo '
'. "\ n";
if ($ domGrabber -> _ FileErrorStr)
{
эхо «Ошибка». $ DomGrabber -> _ FileErrorStr;
}
В моем представлении исходного кода Firefox получено следующее:
<code>PHP Version: 5.2.9<br />
<pre><?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"><head><title>My document</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /></head><body>
<h1>Hello</h1>
</body></html>
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"><head><title>My document</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /></head><body>
<h1>Hello</h1>
<a name="someAnchor" id="someAnchor"></a>
</body></html>
ошибка
DOMDocument :: loadHTML () [
domdocument.loadhtml ]: идентификатор someAnchor, уже определенный в Entity, строка: 9
Итак, почему DOM говорит, что someAnchor уже определен?
Обновление:
Я экспериментировал с обоими
- Вместо использования loadHTML () я использовал метод loadXML () - и это исправило
- Вместо идентификатора и имени я использовал просто id - Attribute, и это исправило его.
Смотрите скрипт сравнения здесь для завершения:
<code><?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$stringWithNoAnchor = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body >
<p>stringWithNoAnchor</p>
</body>
</html>
EOT;
$stringWithAnchor = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body >
<p>stringWithAnchor</p>
<a name="someAnchor" id="someAnchor" ></a>
</body>
</html>
EOT;
$stringWithAnchorButOnlyIdAtt = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body >
<p>stringWithAnchorButOnlyIdAtt</p>
<a id="someAnchor"></a>
</body>
</html>
EOT;
class domGrabber
{
public $_FileErrorStr = '';
public $useHTMLMethod = TRUE;
/**
*@desc DOM object factory does the work of loading the DOM object
*/
public function loadDOMObjAndWriteOut($htmlString)
{
$this->_FileErrorStr ='';
$xmlDoc = new DOMDocument();
set_error_handler(array($this, '_FileErrorHandler')); // Warnings and errors are suppressed
if ($this->useHTMLMethod)
{
$xmlDoc->loadHTML($htmlString);
}
else {
$xmlDoc->loadXML($htmlString);
}
restore_error_handler();
echo "<h1>";
echo ($this->useHTMLMethod) ? 'using xmlDoc->loadHTML() ' : 'using $xmlDoc->loadXML()';
echo "</h1>";
echo '<pre>';
print $xmlDoc->saveXML();
echo '
"\ п".
if ($ this -> _ FileErrorStr)
{
эхо «Ошибка». $ Это -> _ FileErrorStr;
}
}
/ **
* @ desc public, чтобы он мог отлавливать ошибки извне этого класса
* /
публичная функция _FileErrorHandler ($ errno, $ errstr, $ errfile, $ errline)
{
if ($ this -> _ FileErrorStr === null)
{
$ this -> _ FileErrorStr = $ errstr;
}
еще {
$ this -> _ FileErrorStr. = (PHP_EOL. $ errstr);
}
}
}
$ domGrabber = new domGrabber ();
echo 'Версия PHP:'. phpversion (). '
'. "\ n";
$ domGrabber-> useHTMLMethod = TRUE; // dom-> loadHTML
$ DomGrabber-> loadDOMObjAndWriteOut ($ stringWithNoAnchor);
$ domGrabber-> loadDOMObjAndWriteOut ($ stringWithAnchor);
$ DomGrabber-> loadDOMObjAndWriteOut ($ stringWithAnchorButOnlyIdAtt);
$ domGrabber-> useHTMLMethod = FALSE; // используем DOM-> loadXML
$ DomGrabber-> loadDOMObjAndWriteOut ($ stringWithNoAnchor);
$ domGrabber-> loadDOMObjAndWriteOut ($ stringWithAnchor);
$ DomGrabber-> loadDOMObjAndWriteOut ($ stringWithAnchorButOnlyIdAtt);