2011-06-14 36 views
0

我将使用PHP来解析一个SVG文件,并且我已经使用PHP SimpleXML做了一些测试,效果很好,但是它将所有的对象用相同的类型组合在一起,这对我不好SVG。没有分组的PHP XML

说我有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> 

然后也许“一些更多的SVG“组将重叠并且位于PATH图形的顶部,甚至认为PATH应该位于”更多SVG“组的顶部。我该如何解决?

我已经看到,我可以添加例如order =“X”的所有对象,但由于该文件已经从一开始的排序顺序,这似乎没有必要。谢谢!

回答

1

使用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> 

相关链接:

+0

这是好看!我是DOM对象的新手,但是如何在本示例中的每个中的自己的变量中获取SVG? Like: $ arr [0] =“ SOME SVG”; $ arr [1] =“”; $ arr [2] = SOME MORE SVG; – 2011-06-14 09:07:21

+0

你可以在$ arr数组中收集这些数据,但我不会推荐这个,因为我倾向于直接在dom结构上工作。也许你可以给出一个更详细的例子来说明如何操作这些值,我会相应地更新示例代码。 – Yoshi 2011-06-14 09:15:03

+0

我想要在xml的第一级中获取所有对象及其中的数据。我需要能够让他们每个变量,因为每个第一级包含将被加载到不同的页面上的数据。这是否让你感觉到了? – 2011-06-14 10:26:58