Я пытаюсь использовать simplexml_load_file()
для загрузки XML-файла и достижения тегов <dc:title>
, но когда я $xml
переменную $xml
, загружающую мой XML-файл, все теги, начинающиеся с <dc:
не отображаются. Есть ли способ сообщить парсеру включить их? следует ли использовать другой парсер?
Вот мой пример файла:
<?xml version='1.0' encoding='utf-8'?> <package xmlns="http://www.idpf.org/2007/opf" prefix="ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/" unique-identifier="pub-id" version="3.0" xml:lang="en"> <metadata xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:title>test</dc:title> </metadata> </package>
Код, который я использовал для проверки того, какие теги видны:
$xml = simplexml_load_file('test.xml'); echo '<pre>';var_dump($xml);echo '</pre>';
И результат:
object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(3) { ["prefix"]=> string(80) "ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/" ["unique-identifier"]=> string(6) "pub-id" ["version"]=> string(3) "3.0" } ["metadata"]=> object(SimpleXMLElement)#2 (0) { } }
метаданные на самом деле пусты. Мысли?
Во-первых, dc
– пространство имен, а не часть имени тега. Для целей тестирования вы можете распечатать пространства имен, используемые в данном xml. Выполнение фрагмента
$namespaces = $xml->getNamespaces(true); var_dump($namespaces);
выйдет
array(3) { '' => string(28) "http://www.idpf.org/2007/opf" 'xml' => string(36) "http://www.w3.org/XML/1998/namespace" 'dc' => string(32) "http://purl.org/dc/elements/1.1/" }
Вам необходимо зарегистрировать префикс для пространства имен для использования с xpath, и вы можете использовать его для выбора:
$xml->registerXPathNamespace('b', 'http://purl.org/dc/elements/1.1/'); $a =$xml->xpath('//b:*/text()'); foreach($a as $t) { print($t."\n"); }
Это приведет к test
элемента, который вы хотите получить.