2011-10-28 35 views
1

我使用Zend_DOM_Query来使用DOM读取HTML元素。使用DOM添加HTML?

<input type="text" class="a"> 
<input type="text" class="a"> 
<input type="text" class="a"> 

我加载html并找到<input>,然后遍历结果。

foreach($inputss as $input){ 
} 

我真正想要做的是每个<input>像另一个输入后,但不同的类名<input type="text" class="b">的添加额外的标记。在结束我的全部标记看起来像这样

<input type="text" class="a"> 
<input type="text" class="b"> 
<input type="text" class="a"> 
<input type="text" class="b"> 
<input type="text" class="a"> 
<input type="text" class="b"> 

我一直看到使用createElement()但没有什么似乎添加HTML我需要它添加的方式的例子。我错过了什么吗?

回答

2

做到这一点,最简单的方法确实与createElement

foreach($inputss as $input){ 
    $newEl = $input->ownerDocument->createElement('input'); 
    $newEl->setAttribute('type', 'text'); 
    $newEl->setAttribute('class', 'b'); 
    $input->parentElement->insertBefore($newEl, $input->nextSibling); 
} 

除了最后一行,这是无可否认有点冗长,这似乎很简单我。

我想你可能createDocumentFragment做到这一点,使用appendXML插入HTML的字符串,但我没有看到这将是显著更简便快捷。

注意,这个原理的作用是在一个Zend_Dom_Query_Result对象内部有正常的DOM对象,所以你可以在它们上面使用正常的DOM方法。

1

我不知道这是否这你在找什么,但这个例子可以是有益的:

$html = <<<HTML 
<input type="text" class="a"> 
<input type="text" class="a"> 
<input type="text" class="a"> 
HTML; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 
$nodes = $xpath->query('//input[@class="a"]'); 
foreach ($nodes as $node) { 
    $newNode = $node->cloneNode(); 
    $newNode->setAttribute('class', 'b'); 
    $node->parentNode->insertBefore($newNode, $node->nextSibling); 
} 

var_dump(($dom->saveHTML()));