2011-06-09 135 views
2

我想知道如何使用PHP来操作DOM树?PHP中的DOM DOM操作

我已经看到一些XML DOM加载在html文件中的答案。但是如果我不需要加载呢?如果在我想要处理的文档中使用XML DOM脚本,该怎么办?

我有一个下面的例子,打印出所有的文件夹。在答案中填空。我想创建文件夹名称为文本节点的div元素。答案需要有一些XML DOM脚本,因为我将创建更多的元素,而不仅仅是我的网站中的一个div元素。例如使用回声并不实际,因为您可能会在错误的元素内插入元素等。

$sql = " 
    SELECT name 
    FROM folders 
    WHERE profileId = '$profileId' 
"; 
$result = mysql_query($sql) or die('Error6: '.mysql_error()); 
while($row = mysql_fetch_array($result)) { 

} 
+0

为了澄清,是你的问题,你正在构建一个字符串像'

在一个'地方,然后你想在代码中插入节点的其他地方? – 2011-06-09 22:28:01

回答

4

你不需要PHP来操纵已经生成的文档的dom。只需让PHP直接生成一些HTML就简单多了。 DOM在那里检测/更改其他地方生成的HTML。换句话说,你的脚本也只是:

while($row = mysql_fetch_array($result)) { 
    echo "<div>{$row['name']}</div>"; 
} 

DOM例子,证明沉闷

好吧,这里是PHP的方法来产生了一些内部的跨度和诸如此类的一段文字:

echo "<div> This is my div, <span>There are many like it, <b>but this one</b> is</span> mine</div>"; 

等效的DOM调用:(没有测试,只是为了演示):

$dom = new DOM; 

$bold = new DOMElement('b'); 
$bold->appendChild(new DOMText('but this one')); 

$span = new DOMElement('span'); 
$span->appendChild(new DOMText('There are many like it,')); 
$span->appendChild($bold); 
$span->appendChild(new DOMText(' is'); 

$div = new DOMElement('div'); 
$div->appendChild(new DOMText(' This is my div,')); 
$div->appendChild($span); 
$div->appendChild(' mine'); 

echo $div->saveXML(); 

所以.......仍然使用DOM的东西比使用echo更容易?

+0

所以使用echo总是很麻烦。如果我有多个div元素呢? – einstein 2011-06-09 21:27:39

+0

@Woho:在PHP中使用echo来吐出一些HTML要比使用DOM调用来逐个建立文档要容易得多。如果你有更多的东西放在div中,那么只需回显出html片段即可。否则,你会被困在一个“创建节点”,“填充节点”,“插入节点”序列的LONG序列中。 – 2011-06-09 21:46:56

0

我希望我理解正确。

$result = mysql_query($sql) or die('Error6: '.mysql_error()); 
while($row = mysql_fetch_array($result)){ 
    ?><div><?php echo $result[0]; ?></div><?php 
} 

如果这不是你想要的,请通过添加你想要达到的内容来详细说明你的问题。

+0

您需要在PHP中使用XML DOM。因为我会创建很多html元素 – einstein 2011-06-09 21:24:51

0

从技术上讲,这是前置DOM,因为在将HTML输出到客户端之前,它将在HTML中构建页面,此时它将成为客户端上下文中的文档对象模型。因此,您的DOM操作实际上只是服务器端PHP中的HTML生成。

<html> 
<head> 
</head> 
<body> 

<?php 
$sql = " 
SELECT name 
FROM folders 
WHERE profileId = '".mysql_escape_string($profileId)."' 
"; 
$result = mysql_query($sql) or die('Error6: '.mysql_error()); 
while($row = mysql_fetch_array($result)){ 
    echo "<div>".htmlentities($row['name'])."</div>"; 
} 
?> 
</body></html> 

我还添加函数mysql_escape_string到您的SQL语句,以帮助从SQL注入攻击保护,同时使用的回声输出ヶ辆,以帮助防止脚本插入到页面中。

+0

我认为,为了充分回答Woho87的问题,他们需要提供他们期望发送给客户的输出示例。 – dunos 2011-06-09 21:59:03

1

对于PHP驱动的DOM操作,请尝试phpQuery。如果你熟悉jQuery,类似的语法使它成为一个很好的库。

0

我发现使用PHP的内置DOM实现(libxml的)非常笨重的节点HTML,由于它仅支持DOM 2.我更喜欢使用phpgt/DOM(https://github.com/phpgt/dom)可用through composer

用例:

$document = new \phpgt\dom\HTMLDocument(
    "<!doctype html><h1>My list of amazing things</h1> <ul class='my-list'></ul>" 
); 

$result = $database->query("SELECT thing FROM Amazing"); 
$ul_output = $document->querySelector("ul.my-list"); 

foreach($result as $row) { 
    $li = $document->createElement("li"); 
    $li->textContent = $row["thing"]; 
    $ul_output->appendChild($li); 
} 

echo $document->saveHTML(); 

完全对项目的Github上维基可用文档:https://github.com/phpgt/dom/wiki