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

これは単なる URIhttp://www.w3.org/2000/svgであり、プレフィックスは指定されていません。そのルート要素名前空間です。<svg>

したがって、プレフィックスを登録する必要があります (すでにプレフィックスが付けられている他の名前空間は、自動的に登録されているはずです)。

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

これは、これまでに行ったことです。

登録済みのプレフィックスを xpath クエリで使用するには、タグ名の前にプレフィックスを付けます。

/svg:svg/svg:g[1]

<g>その SVG-Namespaceの最初の要素を提供する必要があります。これについてさらに説明/説明が必要な場合はお知らせください。

オンライン デモを参照してください。

これは、前の質問の理由の概要とまったく同じです。

于 2013-04-26T10:40:27.407 に答える