Passa attraverso gli elementi SVG con PHP

Come posso scorrere gli elementi SVG con PHP?

<?php $svgString = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="overflow: hidden; position: relative;" width="9140" version="1.1" height="3050"> <rect x="0" y="0" width="9140" height="3050" r="0" rx="0" ry="0" fill="#FFFF00" stroke="#000"/> <image x="-101.5" y="-113.5" width="203" height="227" xlink:href="1.jpg" stroke-width="1"></image> <image x="-201.5" y="-213.5" width="103" height="127" xlink:href="2.jpg" stroke-width="1"></image> </svg>'; $svg = new SimpleXMLElement( $svgString ); $result = $svg->xpath('//image'); echo count( $result ); for ($i = 0; $i < count($result); $i++) { var_dump( $result[$i] ); } 

count($result) restituisce 0, quindi il loop è omesso.

Che cosa sto facendo di sbagliato?

Il documento svg sta usando uno spazio dei nomi predefinito:

 <svg xmlns="http://www.w3.org/2000/svg" ... 

Inoltre, lo spazio dei nomi xlink viene utilizzato per gli attributi image @ href. È necessario registrare lo spazio dei nomi predefinito e lo spazio dei nomi xlink utilizzando registerXPathNamespace() :

 $svg = new SimpleXMLElement( $svgString ); // register the default namespace $svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg'); // required for the <image xlink:href=" ... attribute $svg->registerXPathNamespace('xlink', 'http://www.w3.org/1999/xlink'); // use the prefixes in the query $result = $svg->xpath('//svg:image/@xlink:href'); echo count( $result ); // output: '2' for ($i = 0; $i < count($result); $i++) { var_dump( $result[$i] ); } 

Oh gioia, spazio dei nomi:

 $svg = new SimpleXMLElement( $svg ); $namespaces = $svg->getDocNamespaces(); $svg->registerXPathNamespace('__nons', $namespaces['']); $result = $svg->xpath('//__nons:image');