Als XML-basiertes Dateiformat enthalten SVG-Dateien normalerweise Beschreibungen von Grafiken wie Pfaden, Linien, Rechtecken, Kreisen usw. Die Struktur unterscheidet sich nicht wesentlich von der einer normalen XML-Datei, aber der Namespace und die Elementeigenschaften können zusätzliche Aufmerksamkeit erfordern.
SVG -Dateien verwenden normalerweise den Namespace, was bedeutet, dass Elemente in der Datei möglicherweise bestimmte Präfixe haben. Zum Beispiel hat das <Svg> -Element normalerweise die folgende Namespace -Deklaration:
<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">
Wenn Sie SimplexML_Load_String direkt verwenden, um eine solche Datei zu analysieren, berücksichtigen SimplexML -Objekte. Wenn Sie also auf Elemente zugreifen, müssen Sie sich möglicherweise mit diesen Namespaces befassen.
<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">// Ausgabe: {http://www.w3.org/2000/svg}svg</span></span><span>
</span></span>
In diesem Fall müssen wir den Elementnamen mit dem Namespace verwenden, um auf den entsprechenden Inhalt zuzugreifen. Zum Beispiel:
<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>
Zusätzlich zum Element selbst können bestimmte Eigenschaften in der SVG -Datei (z. B. XLink: HREF ) auch Namespaces enthalten. Daher ist auch besondere Aufmerksamkeit erforderlich, wenn Sie auf diese Eigenschaften zugreifen.
<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">// Ausgabe对应的属性值</span></span><span>
</span></span>
SVG enthält nicht nur grafische Beschreibungen, sondern auch Text (z. B. <text> Elemente). Bei der Analyse von SVG extrahiert Simplexml die Textknoten automatisch in normale Zeichenfolgen. Einige SVG -Textinhalte können jedoch Formatierungsprobleme wie Zeilenpausen, Räume usw. enthalten. Diese Details können während der Parsen ignoriert oder nicht ordnungsgemäß verarbeitet werden.
Wenn Sie auf ein <text -Element zugreifen, können Sie den Textinhalt wie ein normales XML -Element extrahieren:
<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">// Ausgabe文本内容</span></span><span>
</span></span>
Es ist jedoch zu beachten, dass Simplexml_Load_String möglicherweise nicht wie erwartet zurückgibt, wenn der Text im <text> Element mehrere untergeordnete Elemente oder komplexe verschachtelte Strukturen enthält.
Einige SVG -Dateien können JavaScript -Skripte oder Ereignishandler (wie Onclick , Onload usw.) enthalten, die normalerweise zur Definition von Interaktionen oder Animationen verwendet werden. Bei der Analyse analysiert Simplexml_Load_String diese Skriptteile nicht, aber Probleme können auftreten, wenn sie direkt gelesen und verarbeitet werden.
Wenn Sie sich nicht mit JavaScript -Teilen in SVG befassen müssen, können Sie diese Skript -Teile durch einfache reguläre Ausdrücke oder String -Operationen löschen oder herausfiltern.
<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>
Auf diese Weise können wir sicherstellen, dass SimpXML nur reine SVG -Diagrammdaten verarbeitet, ohne vom Skript -Teil gestört zu werden.
SVG -Dateien enthalten möglicherweise einige Sonderzeichen wie & , < , > usw. Diese Zeichen haben spezifische Bedeutungen in XML -Dateien und müssen möglicherweise entkommen. PHP analysiert diese Zeichen automatisch bei der Verwendung von Simplexml_Load_String , aber in einigen Fällen ist es weiterhin erforderlich, diese Zeichen manuell zu verarbeiten.
Wenn der SVG -Inhalt spezielle Zeichen enthält, die nicht entkommen sind, kann dies beim direkten Laden an Parsenfehler verursachen. Stellen Sie sicher, dass alle Sonderzeichen in der SVG -Datei ordnungsgemäß entkommen oder codiert sind.
<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 -Dateien können sehr groß sein, insbesondere wenn sie komplexe Grafiken oder große Datenmengen enthalten. Beim Laden großer SVG -Dateien mit SimplexML_Load_String kann dies zu Leistungspflichtigen oder Speicherüberlaufproblemen führen. Um mit dieser Art von Problem umzugehen, können Sie in Betracht ziehen, wenn Sie ein Chunked -Lesen in Betracht ziehen oder andere Methoden verwenden, um die Speicherverwendung zu optimieren.
Die LIBXML -Bibliothek von PHP bietet viele Optimierungsoptionen. Durch die Konfiguration von libxml_use_internal_errors und anderen Parametern können Sie die unnötige Fehlerbehebung und den Speicherverbrauch während der Parsen reduzieren.
<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>