不分组的PHP XML

问题描述

| 我将使用PHP解析SVG文件,并且已经使用PHP SimpleXML进行了一些测试,这些测试效果很好,但是它将所有具有相同类型的对象组合在一起,但这对我的SVG不利。 说我有这样的SVG文件
<svg>
   <g>SOME SVG</g>
   <path d=\"SOME X AND Y\'s\"/>
   <g>SOME MORE SVG</g>
</svg>
然后,简单XML将对相同的对象进行分组,例如:
[g][0] => \'SOME SVG\'
[g][1] => \'SOME MORE SVG\'
[path[0] => \'SOME AND X AND Y\'s\'
所有这些都可以很好地用于编辑数据,但是当我想再次将其转换回SVG时,我已经失去了对象的排序顺序!对于普通的XML,这可能不是问题,但是对于SVG文件,对象的顺序也是层排序的顺序,因此,如果将输出转换回SVG,我将得到:
<svg>
   <g>SOME SVG</g>
   <g>SOME MORE SVG</g>
   <path d=\"SOME X AND Y\'s\"/>
</svg>
然后,即使认为PATH应该位于“ SOME MORE SVG”组的顶部,“ SOME MORE SVG”组也会重叠并且位于PATH图形的顶部。我该如何解决? 我已经看到可以将order = \“ X \”添加到所有对象,但是由于该文件从一开始就具有排序顺序,所以这似乎是不必要的。谢谢!     

解决方法

        使用PHP DOM,您不会遇到此问题:
$svg = \'<svg>
   <g>SOME SVG</g>
   <path d=\"SOME X AND Y\\\'s\"/>
   <g>SOME MORE SVG</g>
</svg>\';

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

$xpath = new DOMXpath($dom);

// selecting only g nodes directly under svg (root node)
$gNodes = $xpath->query(\'/svg/g\'); // $gNodes will be of type: DOMNodeList with every element being of type: DOMElement,which extends DOMNode

foreach ($gNodes as $gNode) {
    // doing stuff with $gNode
    $gNode->nodeValue .= \' adding stuff\';
}

echo $dom->saveXml();
输出:
<?xml version=\"1.0\"?>
<svg>
   <g>SOME SVG adding stuff</g>
   <path d=\"SOME X AND Y\'s\"/>
   <g>SOME MORE SVG adding stuff</g>
</svg>
有用的链接: DOM元素 DOM节点 DOMNodeList DOMX路径