Php 带命名空间的xpath

Php 带命名空间的xpath,php,xml,xpath,Php,Xml,Xpath,我正在尝试将php SimpleXML中的xpath与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/stru

我正在尝试将php SimpleXML中的xpath与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.

-  
- 
- 
没有一个
假的
假的
2011-11-18T13:56:45
- 
经济合作与发展组织
经济合作与发展组织
- 
- 
观察状态
观察高度
-
打破
破裂

等等等等。
在我的php代码中,我有以下代码,它注册名称空间,然后使用xpath获取代码列表:- $xml->registerXPathNamespace('test','http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message');

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

我希望能够使用xpath在树中降低一个级别,即代码列表,并认为以下方法可行:-

$codelistpath=$xml->xpath('test:CodeLists/CodeList')


但它只生成一个空数组。我无法使用xpath访问文档中的任何其他内容。我已经花了几个小时试图解决这个问题,因此非常感谢您的帮助。

看起来registerXPathNamespace只适用于下一个xpath查询(根据。。。因此,如果您已经运行了
$xml->xpath('test:CodeLists')
,请在运行
$xml->xpath('test:CodeLists/CodeList')之前再次尝试注册名称空间

元素属于继承自
元素的默认命名空间,即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');

下一步就是跟随。注册后,可以随时使用注册的名称空间调用
xpath()
方法。感谢您抽出时间回复,Jason。正如萨拉特所说,问题在于代码列表位于默认名称空间中,而不是测试名称空间。这很公平。有时候,当我对这些工具不太熟悉时,我会扔掉一些东西,看看有什么坚持住了。这是绝对正确的,我没有意识到代码列表位于不同的名称空间中。我已经按照你的建议修改了代码,现在一切正常。我对你感激不尽。