DOMDocument saveHTML 未返回 HTML "IMG"、"INPUT" 的正确标准
DOMDocument saveHTML is not returning correct HTML Standards for "IMG", "INPUT"
我非常喜欢 PHP 库 phpQuery content parser (because its quite like jQuery, while using the PHP DOMDocument 来提取标记)但是我注意到 快速关闭事件 <img />
而不是 <div></div>
我注意到这个错误也出现在 DOMDocument
和 phpQuery
中。
我写了一个简单的 class PhpContentDocument 来转储一个简单的 html 文档。
require_once "../phpquery_lib/phpQuery.php";
require_once "PhpContentDocument.class.php";
$sample_document = new PhpContentDocument('Sample Document');
$sample_document->addElement('text element', "<span class='text_element'>This is some Sample Text</span>");
$sample_document->addElement('image element', "<img src='png_file.png' alt='png_file' id='png_file' />");
$sample_document_string = $sample_document->get_string();
结果如您所料...
<!DOCTYPE HTML>
<html>
<head>
<title>Sample Document</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<body>
<span class='text_element'>This is some Sample Text</span>
<img src='png_file.png' alt='png_file' id='png_file' />
</body>
</html>
但是使用saveHTML调用文档时
$php_query_document = new DOMDocument('UTF-8', '1.0');
$php_query_document->formatOutput = true;
$php_query_document->preserveWhiteSpace = true;
$php_query_document->loadHTML($sample_document_string);
$php_query_document_string = $php_query_document->saveHTML();
echo $php_query_document_string;
它returns ...
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Sample Document</title>
</head>
<body>
<span class="text_element">This is some Sample Text</span>
<img src="png_file.png" alt="png_file" id="png_file">
</body>
</html>
我遇到的主要问题是,当我在元素 img#png_file
上使用 SimpleXMLElement(例如)
使用内容解析器 传递 <img src="png_file.png" alt="png_file" id="png_file">
作为参数
$simple_doc = new SimpleXMLElement((string) $php_query_document->find('img#png_file'));
我收到以下警告和异常,即使我的原始标记适用于 SimpleXMLElement
。
Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Premature end of data in tag img line 1 in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
Warning: SimpleXMLElement::__construct(): <img src="png_file.png" alt="png_file" id="png_file"> in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
Warning: SimpleXMLElement::__construct(): ^ in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php:17 Stack trace: #0 F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php(17): SimpleXMLElement->__construct('<img src="png_f...') #1 {main} thrown in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
由于元素没有closing event
.
TL:DR Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Premature end of data in tag img line 1
我该如何解决这个问题?我确实有一些想法,但最好
- 我想要一个可以使用正则表达式(我知道元素类型)的解决方案,以便用
<{element_type}/>
替换 />
,反之亦然。
DOMDocument
class saveHTML
已修复(可能 class 扩展 DOMDocument
以继承其他功能)。
如果您使用 DOMDocument::saveXML()
instead of DOMDocument::saveHTML()
,您将得到有效的 XML。
如有必要,您可以删除 xml 声明行 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
。
我刚刚意识到您想要 find()
方法 return 正确的 XML。因此,我不确定我的上述建议是否有帮助,如果这意味着您必须更改实现该方法的 class。
也许你可以做一些有点复杂的事情,比如:
$node = $php_query_document->find('img#png_file');
$simple_doc = new SimpleXMLElement( $node->ownerDocument->saveXML( $node ) );
这假定 $node
是包含节点的 DOMNode
, which I suspect it is. What this does is ask the $node->ownerDocument
(the DOMDocument
的某种实现)仅将该特定节点保存为 XML。
另一种可能性(我不一定会推荐)是让 SimpleXML
宽松一些,在解析时,通过将以下 libxml 选项传递给构造函数:
$simple_doc = new SimpleXMLElement(
(string) $php_query_document->find('img#png_file'),
LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_ERR_FATAL
);
这会在解析内容时抑制 libxml 错误。 libxml 是基础 XML 解析器,由 SimpleXML 和 DOMDocument(以及其他)使用。
我非常喜欢 PHP 库 phpQuery content parser (because its quite like jQuery, while using the PHP DOMDocument 来提取标记)但是我注意到 快速关闭事件 <img />
而不是 <div></div>
我注意到这个错误也出现在 DOMDocument
和 phpQuery
中。
我写了一个简单的 class PhpContentDocument 来转储一个简单的 html 文档。
require_once "../phpquery_lib/phpQuery.php";
require_once "PhpContentDocument.class.php";
$sample_document = new PhpContentDocument('Sample Document');
$sample_document->addElement('text element', "<span class='text_element'>This is some Sample Text</span>");
$sample_document->addElement('image element', "<img src='png_file.png' alt='png_file' id='png_file' />");
$sample_document_string = $sample_document->get_string();
结果如您所料...
<!DOCTYPE HTML>
<html>
<head>
<title>Sample Document</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<body>
<span class='text_element'>This is some Sample Text</span>
<img src='png_file.png' alt='png_file' id='png_file' />
</body>
</html>
但是使用saveHTML调用文档时
$php_query_document = new DOMDocument('UTF-8', '1.0');
$php_query_document->formatOutput = true;
$php_query_document->preserveWhiteSpace = true;
$php_query_document->loadHTML($sample_document_string);
$php_query_document_string = $php_query_document->saveHTML();
echo $php_query_document_string;
它returns ...
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Sample Document</title>
</head>
<body>
<span class="text_element">This is some Sample Text</span>
<img src="png_file.png" alt="png_file" id="png_file">
</body>
</html>
我遇到的主要问题是,当我在元素 img#png_file
上使用 SimpleXMLElement(例如)
使用内容解析器 传递 <img src="png_file.png" alt="png_file" id="png_file">
作为参数
$simple_doc = new SimpleXMLElement((string) $php_query_document->find('img#png_file'));
我收到以下警告和异常,即使我的原始标记适用于 SimpleXMLElement
。
Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Premature end of data in tag img line 1 in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
Warning: SimpleXMLElement::__construct(): <img src="png_file.png" alt="png_file" id="png_file"> in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
Warning: SimpleXMLElement::__construct(): ^ in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php:17 Stack trace: #0 F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php(17): SimpleXMLElement->__construct('<img src="png_f...') #1 {main} thrown in F:\xampp\htdocs\Test_Code\phpquery_test_items\index.php on line 17
由于元素没有closing event
.
TL:DR Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Premature end of data in tag img line 1
我该如何解决这个问题?我确实有一些想法,但最好
- 我想要一个可以使用正则表达式(我知道元素类型)的解决方案,以便用
<{element_type}/>
替换/>
,反之亦然。 DOMDocument
classsaveHTML
已修复(可能 class 扩展DOMDocument
以继承其他功能)。
如果您使用 DOMDocument::saveXML()
instead of DOMDocument::saveHTML()
,您将得到有效的 XML。
如有必要,您可以删除 xml 声明行 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
。
我刚刚意识到您想要 find()
方法 return 正确的 XML。因此,我不确定我的上述建议是否有帮助,如果这意味着您必须更改实现该方法的 class。
也许你可以做一些有点复杂的事情,比如:
$node = $php_query_document->find('img#png_file');
$simple_doc = new SimpleXMLElement( $node->ownerDocument->saveXML( $node ) );
这假定 $node
是包含节点的 DOMNode
, which I suspect it is. What this does is ask the $node->ownerDocument
(the DOMDocument
的某种实现)仅将该特定节点保存为 XML。
另一种可能性(我不一定会推荐)是让 SimpleXML
宽松一些,在解析时,通过将以下 libxml 选项传递给构造函数:
$simple_doc = new SimpleXMLElement(
(string) $php_query_document->find('img#png_file'),
LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_ERR_FATAL
);
这会在解析内容时抑制 libxml 错误。 libxml 是基础 XML 解析器,由 SimpleXML 和 DOMDocument(以及其他)使用。