Как получить значение атрибута с пространством имен

Я хотел бы получить содержимое атрибута xsi: schemaLocation . Он отлично работает с getElementsByTagName в php (и foreach after), но он уродлив, не так ли?

Как получить тот же контент с помощью простого запроса Xpath?

Вот краткий пример содержимого xml:

<?xml version="1.0" encoding="utf-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" creator="blabla" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0"> ... </gpx> 

Благодаря!

С помощью класса SimpleXMLElement вы можете легко получить атрибут xsi: schemaLocation :

 <?php $xml = <<<XML <?xml version="1.0" encoding="utf-8"?> <gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" creator="blabla" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0"> </gpx> XML; $sxe = new SimpleXMLElement($xml); $schemaLocation = $sxe->attributes('xsi', true)->schemaLocation; echo (string) $schemaLocation; 

Обычно вам необходимо сначала зарегистрировать пространства имен, которые вы хотите использовать, с библиотекой XPath. Затем вы можете запросить атрибут, включив префикс пространства имен вместе с именем.

Итак, допустим, вы используете DOMXPath, вы можете зарегистрировать следующие пространства имен:

 $xpath = new DOMXPath($doc); $xpath->registerNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance"); $xpath->registerNamespace("gpx", "http://www.topografix.com/GPX/1/0"); 

А затем вы можете запросить атрибут schemaLocation с чем-то вроде этого:

 $xpath->query("/gpx:gpx/@xsi:schemaLocation",$doc);