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