2013-04-26 42 views
3

我想用PHP獲取SVG標記內容。如何用PHP獲取SVG標記內容

test.svg:

<?xml version="1.0" encoding="utf-8"?> 
<!-- comment --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="202.5px" height="226.084px" viewBox="0 0 202.5 226.084" enable-background="new 0 0 202.5 226.084" xml:space="preserve"> 
    <g> 
     <path d="M0,13.628c47.7940,13.628z"/> 
     <polygon points="108.48,207.874 145.506,196.948 145.506,204.536 108.48,214.854 "/> 
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    </g> 
    <g>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    </g> 
    <anythingElse>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    <anythingElse>  
</svg> 

PHP:現在

$svg = new SimpleXMLElement(file_get_contents('test.svg') ); 

$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg'); 
$svg->registerXPathNamespace('xlink', 'http://www.w3.org/1999/xlink'); 

,我想獲得的SVG標籤內容爲字符串。

期望的結果(例如硬編碼):

$content = '<g> 
    <path d="M0,13.628c47.7940,13.628z"/> 
    <polygon points="108.48,207.874 145.506,196.948 145.506,204.536 108.48,214.854 "/> 
    <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
</g> 
    <g>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    </g> 
    <anythingElse>  
     <path fill="none" stroke="#000000" d="M114.55,223.959"/> 
    <anythingElse> '; 

//編輯:

我不想看對於G標籤: '/ SVG:SVG/SVG:G'。 由於不能保證svg內部會有g標籤。可能會有更多的一個g標籤或其他標籤。

我想獲取開啓和關閉svg標籤之間的所有內容。

+1

如何這是一個重複? – user2015338 2013-04-26 12:57:08

+0

只需尋找「simplexml get children」,你應該找到代碼片段,教程和什麼不是。下次讓你的編程問題更加清晰,你可能會遇到更多的表達問題,而不是編程問題。以防萬一,加入到PHP聊天中。 – hakre 2013-04-26 13:17:13

回答

4

您已經知道了正確的(更可能是:複製並粘貼來自a previous answer而沒有進一步理解的示例代碼),因爲XML中沒有它的前綴,所以您需要在此註冊XML名稱空間以用於xpath:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="202.5px" height="226.084px" viewBox="0 0 202.5 226.084" enable-background="new 0 0 202.5 226.084" xml:space="preserve"> 

它只是URI http://www.w3.org/2000/svg,沒有給出前綴。它是<svg>根元素的命名空間。

因此,你需要註冊前綴(其它已命名前綴應自動已註冊):

$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg'); 

這是你迄今爲止做什麼。

要立即使用註冊的前綴的XPath查詢,它的前綴標記名:

/svg:svg/svg:g[1] 

應該給你在SVG的命名空間的第一<g>元素。讓我知道這是否還需要進一步的解釋/澄清。

請參閱online demo

這也是完全一樣的原因輪廓到以前的問題:

+0

這只是一個例子。我不想要g標籤。我想要了解svg標籤內的內容。我試過$ svgBody = $ svg-> xpath('// svg:svg');例如,仍然不知道爲什麼它不工作 – user2015338 2013-04-26 12:05:34

+0

和'$ svgBody-> asXML('php:// output');''然後在純源中打印您的內容? *編輯:*我還添加了一個[在線演示](http://eval.in/17651),以便您可以看到代碼的概述是如何工作的。 – hakre 2013-04-26 12:08:00

+0

致命錯誤:調用非對象的成員函數asXML() – user2015338 2013-04-26 12:12:32

1

我想獲得onle對於g標籤,你不要;噸需要的命名空間,你可以試試這個:

$result = $svg->xpath('svg/g'); 
foreach ($result as $gtag) { 
    echo $gtag . "\n"; 
} 

我不能,雖然測試它:)