Comment obtenir le contenu de la balise SVG avec PHP
Je voudrais obtenir le contenu de la balise SVG avec PHP.
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');
Maintenant, je voudrais obtenir le svg, le contenu de la balise comme une chaîne de caractères.
Résultat souhaité (codé en dur exemple):
$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> ';
//EDIT:
Je ne veux pas avoir l'air de g tag: '/svg:svg/svg:g'.
Comme il n'y a aucune garantie que l'intérieur de la svg, il y aura une balise g. Il pourrait y avoir plus d'une balise g ou certains autres balises.
Je veux obtenir tout ce qui est entre l'ouverture et la fermeture des balises svg.
Comment est-ce un doublon?
Il suffit de chercher "simplexml des enfants" et vous devriez trouver des extraits de code, des tutoriels et ce n'est pas. La prochaine fois, faites votre problème de programmation de plus en plus clair, vous risquez plus d'avoir un problème avec l'expression de la programmation. Se joindre au PHP chat au cas où.
Il suffit de chercher "simplexml des enfants" et vous devriez trouver des extraits de code, des tutoriels et ce n'est pas. La prochaine fois, faites votre problème de programmation de plus en plus clair, vous risquez plus d'avoir un problème avec l'expression de la programmation. Se joindre au PHP chat au cas où.
OriginalL'auteur user2015338 | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
Vous l'avez déjà vu (plus probable: copie et collé à partir d'un exemple de code qui vous a été donnée dans une réponse précédente w/o la compréhension de loin) que vous devez vous inscrire à l'espace de noms XML ici pour votre xpath, car il n'y a pas de préfixe dans le XML:
C'est juste l'URI
http://www.w3.org/2000/svg
, pas de préfixe donné. Il est la espace de noms de<svg>
de l'élément racine.Par conséquent, vous devez enregistrer le préfixe (les autres déjà le préfixe d'espace de noms doit être déjà inscrit automatiquement):
Qui est ce que vous faites jusqu'à présent.
Maintenant utiliser votre préfixe enregistré dans la requête xpath, préfixe le nom de balise:
Devrait vous donner la première
<g>
élément SVG-espace de Noms. Laissez-moi savoir si cela a encore besoin de plus d'explications et d'éclaircissements.Voir le démo en ligne.
C'est aussi exactement que la raison pour plan à votre question précédente:
et ce n'
$svgBody->asXML('php://output');
tirages vous ensuite dans la plaine de la source? Edit: j'ai aussi ajouté un démo en ligne de sorte que vous pouvez voir comment/que le code comme indiqué œuvres.Erreur fatale: Appel d'une fonction membre asXML() sur un non-objet
Ne peuvent pas se reproduire, voir le lié exemple. Qui libxml et la version de PHP que vous utilisez?
Vous vous posez des questions à propos de la différence de
*
etsvg:*
au lieu desvg:g
. Aussi garder à l'esprit que vous obtenez un tableau vous avez besoin pour gérer de zéro à tous les éléments. Comparer ainsi avec stackoverflow.com/a/16235134/367456 pour lexpath()
retourne un tableau, notez toujours.OriginalL'auteur hakre
Je pense que pour obtenir onle le g de la marque que vous ne t besoin d'espace de noms, vous pouvez essayer ce:
Je ne peux pas le tester:)
OriginalL'auteur Lukasz 'Severiaan' Grela