Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP和XPath替换节点的内容_Php_Xpath - Fatal编程技术网

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

使用PHP和XPath替换节点的内容,php,xpath,Php,Xpath,我有一个“源html”字符串和一个“替换html”字符串。在“源html”中,我想查找具有特定类的节点,并用我的“替换html”替换其内容。我尝试过使用replaceChild方法,但这似乎需要遍历一个level up(parentNode) 这不管用 $dom = new DOMDocument; $dom->loadXml($sourceHTML); $replacement = $dom->createDocumentFragment(); $replacem

我有一个“源html”字符串和一个“替换html”字符串。在“源html”中,我想查找具有特定类的节点,并用我的“替换html”替换其内容。我尝试过使用replaceChild方法,但这似乎需要遍历一个level up(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);
如何替换已查询的内容或节点?

这似乎可行

  $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);

与其替换子节点,不如在其子节点上循环,放下它们并将新内容作为子节点插入。差不多

foreach ($oldNode->childNodes as $child)
  $oldNode->removeChild($child);
$oldNode->appendChild($replacement);

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

请注意,可能有多个子节点,因此最好在该节点上循环并删除所有子节点。请看我的答案。与其逐个删除子节点,不如$oldNode->nodeValue=“”;