Я пытаюсь использовать 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 ('test', 'http: //www.SDMX.org/resources/SDMXML/schemas/v2_0/ сообщение');
$ 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
.
Вам также необходимо зарегистрировать это с помощью 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')
.