2011-06-14 15 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