SVG将组移至其他组

时间:2012-05-07 21:28:42

标签: php xml svg

想要将一个组移动到另一个组,但在某种程度上它会在一个巨大的执行时间内结束,并且该脚本永远不会结束。问题出在foreach循环休息功能ok。我没有看到任何错误

<?php
// fouten laten zien
error_reporting(~0); 
ini_set('display_errors', 1); 

// test bestand
$bestand = "00000000346.svg";

// maak nieuwe dom
$dom = new DOMDocument; 

// laat svg in dom
$dom->load($bestand);

// krijg svg element
$svg = $dom->getElementsByTagName("svg")->item(0);

// toevoegen link attribute
$svg->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");

// maak script tag
$script = $dom->createElement("script");

// zet script link
$script->setAttribute("xlink:href", "svg_zoom_pan.js");

// toevoegen aan svg
$dom->documentElement->appendChild($script);

// maak groep tag
$svgroot = $dom->createElement("g");

// zet een id
$svgroot->setAttribute("id", "svgroot");

// toevoegen aan svg
$dom->documentElement->appendChild($svgroot);

// krijg alle groepen
$groups = $dom->getElementsByTagName("g");

// doorloop groepen
foreach($groups as $group) {

    if($group->getAttribute("id") != "svgroot") {

        // clone groep
        $cloned = $group->cloneNode(true);

        // toevoegen aan svgroot groep  
        $dom->getElementById("svgroot")->appendChild($cloned);

    }
}

// opslaan bestand
$dom->save("svg_" . $bestand);

?>

2 个答案:

答案 0 :(得分:1)

getElementsByTagName返回一个实时的节点列表。这意味着当您向文档中添加更多组时,变量$groups将更新为包含这些新组。

由于您循环遍历元素的实时列表并在每次迭代中添加一个元素,因此实时列表会更长,循环将永远不会结束。

答案 1 :(得分:0)

如果找到要移动的解决方案:

// doorloop groepen
foreach($groups as $group) {

    // verplaats alleen de andere groepen maar niet de root 
    if($group->getAttribute("id") != "svgroot") {

        // verplaats groep in svgroot       
        $moved = $group->parentNode->removeChild($group);

        // toevoegen aan svgroot groep  
        $firstgroup->appendChild($moved);

    }
}

但它与svg代码相结合?

原始svg的一部分:

<?xml version="1.0" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" width="595.000" height="841.000" viewBox="0.0 0.0 595.000 841.000">
  <title>Produce by DWG to SVG Converter 2012 MX</title>
  <desc>Produce by DWG to SVG Converter 2012 MX</desc>
<g id="000-Onderlegger" display="visible">
<g><path d="M382.47 595.5L382.47 404.1"
fill="none" stroke="RGB(0,124,165)" stroke-width="0.709"/>
</g>
<g><path d="M382.47 404.1L384.45 404.1"
fill="none" stroke="RGB(0,124,165)" stroke-width="0.709"/>
</g>

部分已解析的代码:

<?xml version="1.0" standalone="no"?>
<?xml-stylesheet href="svg.css" type="text/css"?>
<svg xmlns="http://www.w3.org/2000/svg" width="595.000" height="841.000" viewBox="0.0 0.0 595.000 841.000" onload="init(evt)" xmlns:xlink="http://www.w3.org/1999/xlink">
  <script xlink:href="svg-zoom-pan.js"/>
  <g id="svgroot">
    <g id="000-Onderlegger" display="none">
      <g>
        <path d="M382.47 404.1L384.45 404.1" fill="none" stroke="RGB(0,124,165)" stroke-width="0.709"/>
      </g>
      <g>
        <path d="M384.45 396.46L382.47 396.46" fill="none" stroke="RGB(0,124,165)" stroke-width="0.709"/>
      </g>

这里有区别:

<g>
<path d="M382.47 595.5L382.47 404.1" fill="none" stroke="RGB(0,124,165)" stroke-width="0.709"/>
</g>

<g>
<path d="M382.47 404.1L384.45 404.1" fill="none" stroke="RGB(0,124,165)" stroke-width="0.709"/>
</g>

有人知道为什么会这样吗?