2013-04-26 47 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"; 
} 

我不能,虽然测试它:)