2012-03-22 2 views
2

Я пытаюсь использовать XPath в PHP SimpleXML с файлом XML, из которых следующее является соответствующий фрагмент: -XPath с пространством имен

<?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/message');

$ codelistspath = $ xml-> xpath ('test: CodeLists');

Я хотел бы быть в состоянии использовать XPath для перехода на один уровень ниже в дереве, т.е. к Codelist и думал следующее будет работать: -

$ codelistpath = $ xml-> XPATH ('тест: Списки кодов/Codelist ');

Но он просто создает пустой массив. Я не могу найти доступ к чему-либо еще в документе с помощью xpath. Я потратил часы, пытаясь решить эту проблему, поэтому любая помощь будет принята с благодарностью.

ответ

2

В 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'); 
+0

Это абсолютно правильно, я не понял, что CodeList находился в другом пространстве имен. Я изменил свой код, как вы предлагаете, и все работает сейчас. Я не могу тебя отблагодарить. – fbc

0

Похоже registerXPathNamespace работает только для следующего XPATH запроса (в соответствии с documentation) ... так что если вы запустите $xml->xpath('test:CodeLists') уже, повторите попытку регистрации имен перед запуском $xml->xpath('test:CodeLists/CodeList').

+0

* следующий * действительно означает * нижеследующий *. Метод 'xpath()' можно вызвать, используя зарегистрированные пространства имен в любое время после их регистрации. – salathe

+0

Спасибо, что нашли время ответить, Джейсон. Как говорит Салате, проблема заключалась в том, что CodeList находился в пространстве имен по умолчанию, а не в тестовом пространстве имен. – fbc

+0

Достаточно честный. Иногда, когда я не знаком с инструментами, я просто бросаю что-то и вижу, какие палки. – Jason

Смежные вопросы