5

我想用 PHP 获取 SVG 标签内容。

测试.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 里面会有 ag 标签。可能有不止一个 g 标签或其他一些标签。

我想得到打开和关闭 svg 标签之间的所有内容。

4

2 回答 2

7

您已经正确地看到了(更有可能:复制并粘贴了先前答案中提供给您的示例代码,无需进一步理解),您需要在此处为​​您的 xpath 注册 XML 命名空间,因为没有前缀在 XML 中为它:

<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]

应该为您提供<g>该 SVG 命名空间中的第一个元素。让我知道这是否还需要进一步解释/澄清。

请参阅在线演示

这也正是您之前问题的原因概述:

于 2013-04-26T10:40:27.407 回答
1

我认为要获得你不需要的 g 标签;不需要命名空间,你可以试试这个:

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

我无法测试它:)

于 2013-04-26T06:17:35.123 回答