我想用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标签之间获得所有内容。
答案 0 :(得分:6)
您已经看到了正确的(更可能是:从a previous answer中提供给您的示例代码中复制并粘贴,无需进一步了解)您需要在此处为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]
应该为您提供该SVG命名空间中的第一个<g>
元素。如果仍需要进一步解释/澄清,请告诉我。
请参阅online demo。
这也是上一个问题的原因:
答案 1 :(得分:1)
我认为只得到你不需要命名空间的g标签就可以试试这个:
$result = $svg->xpath('svg/g');
foreach ($result as $gtag) {
echo $gtag . "\n";
}
我无法测试它:)