Я пытаюсь использовать xpath в php SimpleXML с xml-файлом, фрагмент которого является следующим: -
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> - <!-- Created on 21-Mar-2012 10:30:46 --> - <message:Structure xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure" xmlns:message="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message" xsi:schemaLocation="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure http://www.sdmx.org/docs/2_0/SDMXStructure.xsd http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message http://www.sdmx.org/docs/2_0/SDMXMessage.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Header xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message"> <ID>none</ID> <Test>false</Test> <Truncated>false</Truncated> <Prepared>2011-11-18T13:56:45</Prepared> - <Sender id="OECD"> <Name xml:lang="en">Organisation for Economic Co-operation and Development</Name> <Name xml:lang="fr">Organisation de coopération et de développement économiques</Name> </Sender> </Header> - <message:CodeLists> - <CodeList id="CL_MEI_OBS_STATUS" agencyID="OECD"> <Name xml:lang="en">Observation Status</Name> <Name xml:lang="fr">Statut d'observation</Name> - <Code value="B"> <Description xml:lang="en">Break</Description> <Description xml:lang="fr">Rupture</Description> </Code> etc. etc.
В моем php-коде у меня есть следующее, которое регистрирует пространство имен, затем использует xpath для получения CodeLists: - $ Xml-> registerXPathNamespace ( 'тест', 'http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message');
$ codelistspath = $ xml-> xpath ('test: CodeLists');
Я бы хотел использовать xpath для перехода на один уровень ниже в дереве, т. Е. В CodeList, и подумал, что будет работать следующее: -
$ codelistpath = $ xml-> xpath ('test: CodeLists / CodeList');
Но он просто создает пустой массив. Я не могу найти способ получить доступ к чему-либо еще в документе с помощью xpath. Я потратил часы, пытаясь решить эту проблему, поэтому любая помощь будет принята с благодарностью.
Элементы CodeList принадлежат пространству имен по умолчанию , унаследованному от элемента <message:Structure> - пространства имен, URI которого http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure.
CodeList
<message:Structure>
http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure
Вам также необходимо зарегистрировать это с registerXPathNamespace().
registerXPathNamespace()
$xml->registerXPathNamespace('default', 'http://www.SDMX.org/resources/SDMXML/schemas/v2_0/structure'); $codelistpath = $xml->xpath('test:CodeLists/default:CodeList');
Похоже, что registerXPathNamespace работает только для запроса следующий xpath (в соответствии с документацией ) ... поэтому, если вы уже выполнили $xml->xpath('test:CodeLists'), попробуйте зарегистрировать пространство имен еще раз перед запуском $xml->xpath('test:CodeLists/CodeList').
$xml->xpath('test:CodeLists')
$xml->xpath('test:CodeLists/CodeList')