xpath с пространством имен - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь использовать 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. Я потратил часы, пытаясь решить эту проблему, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Элементы 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 голосов
/ 22 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...