2013-12-23 110 views
0

我有以下XML字符串:访问子节点

<PagesCreated xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <PageCreated> 
     <Appeal>General Appeal</Appeal> 
     <Fundraiser xmlns:a="http://schemas.datacontract.org/2004/07/GG.Api.Services.Data.Dto.PagesCreated"> 
      <a:FirstName>Michelle</a:FirstName> 
     </Fundraiser> 
     <Id>4965523</Id> 
    </PageCreated> 
</PagesCreated> 

然后我处理与:

$xml = new SimpleXMLElement($trimmed_result); 

然后我就可以用访问PagesCreated的子节点

foreach ($xml->PageCreated as $PageCreated) 
{ 
    die(print_r($PageCreated->children())); 
} 

我的问题是我无法访问<Fundraiser xmlns:a="http://schemas.datacontract.org/2004/07/GG.Api.Services.Data.Dto.PagesCreated">节点。我假设这是因为它是该名称空间的根。

如何访问<Fundraiser>元素内的节点?

回答

1

必须编辑XML <Event>获得工作......

确定这个工程(名字用于为例):

foreach($xml->xpath('//Fundraiser') as $f) { 
var_export($f->xpath('a:FirstName')); 
} 

Here is an updated working link, with 3 Fundraisers; special thanks to @IMSoP

+0

道歉,我不得不从xml字符串中删除敏感数据,原始的确认。 – seavers

+0

谢谢,这是有效的。相对于文档根目录的“//”是什么? – seavers

+0

是的,'//'意味着从文档根开始并找到所有匹配项,这意味着这个答案不能用于多个'Fundraiser'节点。相反,你可以使用'a:FirstName'来开始查看当前的上下文,如下所示:https://eval.in/82305 – IMSoP

0

问题是命名空间前缀。您必须使用ns前缀作为参数调用children方法。看看http://www.php.net/manual/en/simplexmlelement.children.php

你的情况:然后

$ns = $PageCreated->getNamespaces(true); 
$PageCreated->children($ns['a']); 

孩子方法只返回该有前缀的节点。所有其他人将被忽略。

+0

感谢 - 这就是我想会的工作,但它没有。回声$ PageCreated-> children('a')返回空白结果,print_r产生'SimpleXMLElement Object()1'。 – seavers

+0

这是*接近*右 - 'a'只是一个本地前缀,并不保证将来总是表示名称空间;最好的方法是使用完整的命名空间标识符,这是它的URI:' - > children('http://schemas.datacontract.org/2004/07/GG.Api.Services.Data.Dto.PagesCreated')'(你可能想要在那里定义一个变量或常量)。如果你感觉很懒,并且不介意事情改变的可能性,你可以直接使用前缀' - > children('a',true)'。 – IMSoP

+0

谢谢!我太快了。编辑我的例子。 – smiggle