DOMDocument saveHTML没有为“IMG”,“INPUT”返回正确的HTML标准

时间:2017-04-07 05:53:09

标签: html simplexml domdocument w3c-validation phpquery

我是PHP库phpQuery内容解析器的忠实粉丝(因为它非常像 jQuery ,同时使用PHP DOMDocument来提取标记)但我是注意到快速关闭事件 <div></div>而非DOMDocument

的特定元素的错误

我注意到phpQuery以及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(); 也会出现此错误。

我写了一个简单的类PhpContentDocument来转储一个简单的html文档。

<!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>

结果是你所期望的......

$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;

但是在使用saveHTML回忆文档时

<!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

我遇到的主要问题是,当我在元素<img src="png_file.png" alt="png_file" id="png_file"> 上使用SimpleXMLElement时(例如)

使用内容解析器传递$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

由于该元素没有Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Premature end of data in tag img line 1

TL:DR />

我该如何解决这个问题?我确实有一些想法,但最好是

  • 我想要一个可以使用正则表达式(我知道ELEMENT TYPE)的解决方案,以便用<{element_type}/>替换DOMDocument,反之亦然。
  • 修复了saveHTML的{​​li> DOMDocument类(可能是一个扩展apktool d adidasConfirmed.apk --keep-broken-res 的类,以便继承其他功能)。

1 个答案:

答案 0 :(得分:1)

如果您使用DOMDocument::saveXML()代替DOMDocument::saveHTML(),则会获得有效的XML。

如有必要,您可以剥离xml声明行<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我刚刚意识到你希望find()方法返回正确的XML。因此,我不确定我的上述建议是否有用,如果这意味着你必须改变实现该方法的类。

也许你可以做一些有点复杂的事情:

$node = $php_query_document->find('img#png_file');
$simple_doc = new SimpleXMLElement( $node->ownerDocument->saveXML( $node ) );

这预先假定$nodeDOMNode的一些实现,我怀疑它是。$node->ownerDocument。这样做是要求SimpleXML(包含节点的DOMDocument)仅将该特定节点保存为XML。

另一种可能性(我不一定建议)是通过将以下libxml选项传递给构造函数来让$simple_doc = new SimpleXMLElement( (string) $php_query_document->find('img#png_file'), LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_ERR_FATAL ); 在解析时宽松:

npm install --save d3

这会在解析内容时抑制libxml错误。 libxml是基础XML解析器,由SimpleXML和DOMDocument(以及其他)使用。