Как получить содержимое тегов SVG с помощью PHP

Я хотел бы получить содержимое тегов SVG с помощью 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'); 

Теперь я хотел бы получить содержимое 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 tag: '/ svg: svg / svg: g'. Поскольку нет гарантии, что внутри svg появится tag tag. Там может быть больше одного тега g или некоторых других тегов.

Я хочу получить все между открытием и закрытием svg-тегов.

Вы уже видели правильно (скорее всего: скопируйте и вставьте из кода примера, который был предоставлен вам в предыдущем ответе, не понимая его далее), что вам нужно зарегистрировать пространство имен XML здесь для вашего xpath, потому что нет префикса для него в 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] 

Должен дать вам первый элемент <g> в этом пространстве имен SVG. Дайте мне знать, если это все еще нуждается в дальнейшем разъяснении / разъяснении.

См. Онлайн-демонстрацию .

Это точно так же, как и причина вашего предыдущего вопроса:

  • Прокрутка элементов SVG с помощью PHP

Я думаю, чтобы получить g-тэг, который вам не нужен, вам нужно пространство имен, которое вы могли бы попробовать:

 $result = $svg->xpath('svg/g'); foreach ($result as $gtag) { echo $gtag . "\n"; } 

Я не могу проверить это, хотя 🙂