当前位置: 首页 > 知识库问答 >
问题:

保存 HTML 未返回正确的“IMG”、“输入”HTML 标准

曹建明
2023-03-14

我是PHP库phpQuery内容解析器的忠实粉丝(因为它很像jQuery,同时使用PHP DOMDocument提取标记),但我注意到快速关闭事件中包含特定元素的错误

我注意到这个错误也出现在< code>DOMDocument和< code>phpQuery中。

我编写了一个简单的类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;

它返回...

<!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上使用简单XML元素时(例如)

使用内容解析器传递<代码>

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

我收到以下警告和异常,即使我的原始标记可以与 SimpleXML 元素一起使用

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

由于元素没有关闭事件

TL:DR警告:SimpleXMLElement::__construct():实体:第1行:解析器错误:标记img第1行中的数据过早结束

我怎样才能解决这个问题?我确实有一些想法,但最好是

  • 我想要一个解决方案,我可以使用正则表达式(我知道元素类型)来替换/

共有1个答案

谢修真
2023-03-14

如果您使用DOMDocument::saveXML()而不是DOMDocument::saveHTML(),您将获得有效的XML。

如果有必要,您可以剥离xml声明行< code >

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

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

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

这预先假设$nodeDOMNode的一些实现,我怀疑它是。这做的是询问$node-

另一种可能性(我不一定推荐)是在解析时让< code>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(以及其他)使用。

 类似资料:
  • 我目前正在为一个即将开始的项目制作自己的关卡创建器(地图)。一切都很好,除了我在添加放大和缩小选项时遇到了一个问题。我有一个处理所有输入和渲染的类,因为我才刚刚开始。 如您所见,此类扩展了InputAdapter并实现了Application ationListener。 照相机是正字法照相机。cameraHelper是我做的一个助手类。我把摄像机的位置设在这里。cameraHelper.setP

  • 我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是没有将新值添加到@cacheable列表中。 调试完问题后,我发现问题似乎出在钥匙上。 下面是代码片段 所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到S

  • 我正在尝试使用Spring Security性和AngularJS设置默认SuccessUrl,但是成功登录后,html页面将加载到网络中,但没有显示。这是我的安全配置 但是,我仍然显示登录页面,而不是hello.jsp页面。登录的Angular服务: 有人知道为什么吗?

  • 我正在做一个采矿游戏,如果你点击某个地方,你会删除那里的方块。现在所有的块都是正方形,只有当我的2d布尔数组中的点为真时才绘制。所以我试着把这个位置设置为false,只要你点击这里,就是我的输入处理器的触地方法 我也在将相机转换为我的玩家位置。grid.manipulate网格接受一个x和一个y并将其设置为false。我的玩家位于网格坐标中的(10,126),当我点击他旁边时,它显示我正在点击(3

  • 问题内容: 有这个: 并运行: 我得到: 这是不正确的。句子中的标签应为: 通过他们的在线工具测试得出相同的结果。,并且应该是形容词而不是名词。 问题答案: 简而言之 : NLTK并不完美。实际上,没有任何模型是完美的。 注意: 从NLTK版本3.1开始,默认功能不再是旧的MaxEnt English pickle。 现在它是 感知恶搞 从@ Honnibal的实现 ,见 还是更好,但并不完美:

  • 我是JS的新手,不明白为什么我的程序中的图像没有改变。所有的变量都运行良好。下面是片段 所有的图像都被命名为1.jpg,2.jpg,3.jpg,4.jpg,直到24。这是一种很奇怪的方式,我也知道,如果有人知道更好的方式,那会更好。