使用PHP和XPath替换节点的内容

时间:2014-03-08 21:10:20

标签: php xpath

我有一串'source html'和一串'replacement html'。在'source html'中,我想查找具有特定类的节点,并将其内容替换为我的'replacement html'。我尝试过使用replaceChild方法,但这似乎要求我遍历一个级别(parentNode)。

这不起作用

  $dom = new DOMDocument;
  $dom->loadXml($sourceHTML);

  $replacement = $dom->createDocumentFragment();
  $replacement->appendXML($replacementHTML);

  $xpath = new DOMXPath($dom);
  $oldNode = $xpath->query('//div[contains(@class,"arrangement--index__field-dato")]')->item(0);
  $oldNode->replaceChild($replacement, $oldNode);

这样可行,但不是被替换的内容

  $dom = new DOMDocument;
  $dom->loadXml($sourceHTML);

  $replacement = $dom->createDocumentFragment();
  $replacement->appendXML($replacementHTML);

  $xpath = new DOMXPath($dom);
  $oldNode = $xpath->query('//div[contains(@class,"arrangement--index__field-dato")]')->item(0);
  $oldNode->parentNode->replaceChild($replacement, $oldNode);

如何替换我查询过的内容或节点?

2 个答案:

答案 0 :(得分:1)

不是替换子节点,而是遍历它的子节点,删除它们并将新内容作为子节点插入。像

这样的东西
foreach ($oldNode->childNodes as $child)
  $oldNode->removeChild($child);
$oldNode->appendChild($replacement);

这将替换内容(子)而不是节点本身。

答案 1 :(得分:0)

这似乎有效!

  $dom = new DOMDocument;
  $dom->loadXml($sourceHTML);

  $replacement = $dom->createDocumentFragment();
  $replacement->appendXML($replacementHTML);

  $xpath = new DOMXPath($dom);
  $oldNode = $xpath->query('//div[contains(@class,"arrangement--index__field-dato")]')->item(0);
  $oldNode->removeChild($oldNode->firstChild);
  $oldNode->appendChild($replacement);