2011-06-09 120 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