带命名空间的xpath

时间:2012-03-22 17:45:14

标签: php xml 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-&GT; registerXPathNamespace( '测试',的 'http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message');

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

我希望能够使用xpath在树中低一层,即到CodeList,并认为以下内容可行: -

$ codelistpath = $ xml-&gt; xpath('test:CodeLists / CodeList');

但它只是产生一个空数组。我找不到使用xpath访问文档中的任何其他内容的方法。我花了好几个小时试图解决这个问题,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分: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');

答案 1 :(得分:0)

看起来registerXPathNamespace只适用于 next xpath查询(根据documentation)...所以如果你已经运行$xml->xpath('test:CodeLists'),请尝试注册在运行$xml->xpath('test:CodeLists/CodeList')之前再次使用命名空间。