XMLベースのファイル形式として、SVGファイルには通常、パス、行、長方形、円などのグラフィックの説明が含まれています。その構造は、通常のXMLファイルの構造とは大きく異なりませんが、名前空間と要素のプロパティには追加の注意が必要になる場合があります。
SVGファイルは通常、名前空間を使用します。つまり、ファイル内の要素には特定のプレフィックスが必要になる場合があります。たとえば、 <svg>要素には通常、次の名前空間宣言があります。
<img class="max-h-96 w-full" src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20...%3D%22%22%3E%0A%3C%2Fsvg%3E">
Simplexml_load_Stringを直接使用してそのようなファイルを解析する場合、SimplexMLオブジェクトは名前空間を考慮します。したがって、要素にアクセスするときは、これらの名前空間に対処する必要があります。
<span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getName</span></span><span>(); </span><span><span class="hljs-comment">// 出力: {http://www.w3.org/2000/svg}svg</span></span><span>
</span></span>
この場合、名前空間の要素名を使用して、関連するコンテンツにアクセスする必要があります。例えば:
<span><span><span class="hljs-variable">$namespaced_svg</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">children</span></span><span>(</span><span><span class="hljs-string">'http://www.w3.org/2000/svg'</span></span><span>);
</span></span>
要素自体に加えて、SVGファイルの特定のプロパティ( Xlink:HREFなど)にも名前空間がある場合があります。したがって、これらのプロパティにアクセスする際には特別な注意が必要です。
<span><span><span class="hljs-variable">$link</span></span><span> = </span><span><span class="hljs-variable">$element</span></span><span>-></span><span><span class="hljs-title function_ invoke__">attributes</span></span><span>(</span><span><span class="hljs-string">'http://www.w3.org/1999/xlink'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$link</span></span><span>[</span><span><span class="hljs-string">'href'</span></span><span>]; </span><span><span class="hljs-comment">// 出力对应的属性值</span></span><span>
</span></span>
SVGには、グラフィックの説明だけでなく、テキスト( <text>要素など)も含まれています。 SVGを解析すると、SimplexMLはテキストノードを自動的に通常の文字列に抽出します。ただし、一部のSVGテキストコンテンツには、ラインブレーク、スペースなどのフォーマット問題が含まれている場合があります。これらの詳細は、解析中に無視されるか、不適切に処理される場合があります。
<text>要素にアクセスすると、通常のXML要素にアクセスするようにテキストコンテンツを抽出できます。
<span><span><span class="hljs-variable">$textElement</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">xpath</span></span><span>(</span><span><span class="hljs-string">'//svg:text'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$textElement</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]; </span><span><span class="hljs-comment">// 出力文本内容</span></span><span>
</span></span>
ただし、 <text>要素内のテキストに複数の子要素または複雑なネストされた構造が含まれている場合、 Simplexml_load_stringは予想どおりに戻らない場合があることに注意してください。
一部のSVGファイルには、通常、インタラクションやアニメーションを定義するために使用されるJavaScriptスクリプトまたはイベントハンドラー( OnClick 、 Onloadなど)が含まれている場合があります。解析する場合、 Simplexml_load_stringはこれらのスクリプトパーツを解析しませんが、直接読み取って処理された場合は問題が発生する可能性があります。
SVGのJavaScriptパーツを処理する必要がない場合は、簡単な正規表現または文字列操作を介してこれらのスクリプトパーツを削除またはフィルタリングできます。
<span><span><span class="hljs-variable">$clean_svg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/<script[^>]*>.*?<\/script>/is'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$clean_svg</span></span><span>);
</span></span>
このようにして、SimplexMLがスクリプトパーツに邪魔されることなく純粋なSVGグラフデータのみを処理するようにすることができます。
SVGファイルには、 & 、 < 、 >などの特殊文字が含まれる場合があります。これらの文字はXMLファイルに特定の意味を持ち、逃げる必要がある場合があります。 PHPは、 Simplexml_load_stringを使用するときにこれらの文字を自動的に解析しますが、場合によっては、これらの文字を手動で処理する必要があります。
SVGコンテンツに逃げられない特殊文字が含まれている場合、直接読み込むときに解析エラーを引き起こす可能性があります。 SVGファイルのすべての特殊文字が適切に脱出またはエンコードされていることを確認してください。
<span><span><span class="hljs-variable">$escaped_svg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$escaped_svg</span></span><span>);
</span></span>
SVGファイルは、特に複雑なグラフィックスまたは大量のデータが含まれている場合、非常に大きくなる可能性があります。 Simplexml_load_stringで大規模なSVGファイルをロードすると、パフォーマンスのボトルネックまたはメモリオーバーフローの問題を引き起こす可能性があります。このタイプの問題に対処するために、メモリ使用量を最適化するために、他の方法を使用して読んだり、使用したりすることを検討できます。
PHPのLIBXMLライブラリは、多くの最適化オプションを提供します。 libxml_use_internal_errorsおよびその他のパラメーターを構成することにより、解析中に不必要なエラー処理とメモリ使用量を減らすことができます。
<span><span><span class="hljs-title function_ invoke__">libxml_use_internal_errors</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span></span>