使用XML操作在头部添加子元素/元素


Append child/element in head using XML Manipulation

我想在它所在的位置用$styles字符串替换<includes module="styles" />。不幸的是,它附加在身体而不是头部。不管怎样,也许有另一种方法来认识这个问题?

$xml = <<<EOD
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <includes module="styles" />
</head>
<body>
    <includes module="m1" />
    <includes module="m2" />
</body>
</html>
EOD;

$styles = <<<EOD
<styles>
    .m1{
        font-size: 12px;
        font-family: Helvetica, Arial, sans-serif;
        color: blue;
    }
</styles>
EOD;

$dom = new DOMDocument();
$dom->loadXML($xml);
$elements = $dom->getElementsByTagName('includes');
for ($i = $elements->length-1; $i >= 0; $i--) { 
    $element = $elements->item($i);
    $newNode = $dom->createDocumentFragment();
    $mod = $element->getAttribute('module');
    if($mod==='styles'): $newNode->appendXML($styles); endif;
    $element->parentNode->replaceChild($newNode, $element);
}
print $dom->saveXml($dom->documentElement);

欢呼

您需要将$element->parentNode->replaceChild($newNode, $element);放在IF子句中。
我还建议使用foreach和大括号(使其更具可读性)

foreach ($dom->getElementsByTagName('includes') as $element) { 
   $mod = $element->getAttribute('module');
   if($mod === 'styles') {
      $newNode = $dom->createDocumentFragment();
      $newNode->appendXML($styles);
      $element->parentNode->replaceChild($newNode, $element);
   }
}

我发现了这个bug,非常尴尬!我把<styles>拼错了。应该是<style> !显然,它会自动将自定义标签移动到正文中。

@Javad真有趣。因为php测试器在头部留下了错误的样式标签,而不是在我的示例中。也许是因为它与php版本有关?