我是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}/>
替换DOMDocument
,反之亦然。saveHTML
的{li> DOMDocument
类(可能是一个扩展apktool d adidasConfirmed.apk --keep-broken-res
的类,以便继承其他功能)。
答案 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 ) );
这预先假定$node
是DOMNode
的一些实现,我怀疑它是。$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(以及其他)使用。