目标是从本地存储的html文件中提取元素,并在执行php脚本时将其插入当前页面。这是我的第一个主要的PHP项目,所以我希望问题很简单(我为任何非技术语言道歉),但是,正如您将看到的,我无法解决它。
我的代码如下所示:
<?php
$path = $_SERVER["DOCUMENT_ROOT"]."/bglibrary/background.html";
$html = new DOMDocument();
$html->loadHtmlFile($path);
$xpath = new DOMXPath ( $html );
$background = $xpath->query("//*[@id='background-wrapper']");
var_dump($background); // object(DOMNodeList)#307 (0) { }
var_dump($background->item(0)); // object(DOMElement)#306 (0) { }
var_dump($background->item(1)); // NULL
var_dump($html->saveHTML($background)); // NULL
var_dump($html->saveHTML($background->item(0))); // NULL
echo $html->saveHTML(); //Prints full html of the target page
?>
var_dump命令用于调试,它们说明了问题。我认为x-path查询是成功的,因为它只返回一个包含一个项目的节点列表(查询列表中的第二个项目返回NULL)。此外,项目本身被标识为dom元素。
但是我无法以任何形式使用saveHTML
(包括找到目标节点的父节点,然后在其中查找元素以尝试保存它),或{{ 1}}或saveXML
,用于返回,回显,打印或转储所需元素。我也尝试使用saveHTMLfile
php函数获得完全相同的结果。
如果它是一个因素,我的html(也很简单)也会跟随;
getElementById
最后,如果您认为html文件无法以某种方式正确访问,那么我的php中的最终<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Holding File for Images</title>
<style type="text/css">
... some styling
</style>
</head>
<body>
<div id="background-wrapper">
<div id="background1" dataalt="no" class="background">
...A whole load of div elements
</div>
<div id="background2" class="background">
...A whole load of div elements
</div>
</div>
</body>
</html>
会成功输出我刚刚列出的整个html文件,并且渲染效果很好。
今年remyable提出了一个非常相似的问题,除了根据另一个用户的代码似乎运行正常之外没有得到答案。我可以向你保证,这段代码并没有类似的变化似乎运行正常,因此我怀疑问题可能在于我的服务器设置。我正在wordpress站点的header.php文件中执行PHP,该站点使用MAMP在本地托管运行。 MAMP服务器根目录不是'wordpress'文件(因为我也在处理一些非wordpress的东西),因此我使用echo $html->saveHTML();
命令来查找我的html文件。与此案例相关的文件路径为:
root / wordpress / wp-content / themes / FirstTheme / header.php(正在执行php的地方)
root / bglibrary / background.html(目标HTML文件所在的位置)