Php xpath从嵌套元素中获取数据
我正在开发一个与亚马逊产品广告API的接口 我有一个XML,其中包含一个类似于以下内容的部分:Php xpath从嵌套元素中获取数据,php,xpath,Php,Xpath,我正在开发一个与亚马逊产品广告API的接口 我有一个XML,其中包含一个类似于以下内容的部分: <BrowseNodes> <BrowseNode> <Name>Category</Name> <BrowseNodeId>123456</BrowseNodeId> <Ancestors> <BrowseNode> <Name>
<BrowseNodes>
<BrowseNode>
<Name>Category</Name>
<BrowseNodeId>123456</BrowseNodeId>
<Ancestors>
<BrowseNode>
<Name>Whatever</Name>
<BrowseNodeId>987654</BrowseNodeId>
<BrosweNode>
</Ancestors>
</BroseNode>
<BroseNode>
...
</BrowseNode>
</BrowseNodes>
有人能够帮助您使用xpath语法吗?如果不是直接的,你能告诉我你知道的任何新手友好的文档吗?我下载了一本关于这个主题的好书,从中我学到了很多东西,但这有点让我不知所措
下面不是问题的一部分,而是证明其中一个答案是正确的证据。有关详细信息,请参见注释。
预期结果:“无论如何”给定结果:“无论如何”
类别
123456
无论什么
987654
某物
951753
BrowseNodes/BrowseNode/Name
大堆
(
[0]=>SimpleXMLElement对象
(
[0]=>类别
)
[1] =>SimpleXMLElement对象
(
[0]=>SomethingElse
)
)
BrowseNodes/BrowseNode[Name=“Category”]/祖先/BrowseNode/Name
大堆
(
[0]=>SimpleXMLElement对象
(
[0]=>随便什么
)
)
谢谢 如果只想获取节点:
BrowserNodes/BrowserNode[Name=_______]/Ancestors/BrowserNode/Name
如果要获取节点的文本:
BrowserNodes/BrowserNode[Name=_______]/Ancestors/BrowserNode/Name/text()
在这两个示例中,用您正在搜索的名称替换。查找以下示例:
<?php
$xmlString ="
<BrowseNodes>
<BrowseNode>
<Name>Category</Name>
<BrowseNodeId>123456</BrowseNodeId>
<Ancestors>
<BrowseNode>
<Name>Whatever</Name>
<BrowseNodeId>987654</BrowseNodeId>
</BrowseNode>
</Ancestors>
</BrowseNode>
<BrowseNode>
<Name>Category</Name>
<BrowseNodeId>123456</BrowseNodeId>
<Ancestors>
<BrowseNode>
<Name>Whatever</Name>
<BrowseNodeId>987654</BrowseNodeId>
</BrowseNode>
</Ancestors>
</BrowseNode>
</BrowseNodes>";
$result= simplexml_load_string($xmlString);
$counter =0;
$newArray=array();
foreach($result->BrowseNode as $arr) {
$newArray[$counter]['Name'] =(string)$arr->Name;
$newArray[$counter]['BrowseNodeId'] =(string)$arr->BrowseNodeId;
$newArray[$counter]['Ancestors']['Name'] =(string)$arr->Ancestors->BrowseNode->Name;
$newArray[$counter]['Ancestors']['BrowseNodeId'] =(string)$arr->Ancestors->BrowseNode->BrowseNodeId;
$counter++;
}
print"<pre>";
print_r($newArray);
die;
?>
谢谢,看起来我需要你的第二个,我想做$s='BrowseNodes/BrowseNode[Name=Category]/祖先/BrowserNode/Name/text()'但是这是遍历深度,还是我需要知道它嵌套的深度?如果你不确定BrowserNodes
(带“s”)嵌套的深度,在整个事件前面添加后代::
。顺便说一下,我对这一级别的XPath知之甚少。我只是在使用。我发现(至少对我来说)总有一条学习曲线,即使是在理解一项新技术的文档时。我还在做这件事,所以我很感激你能将这些信息分解到我目前的水平。我将利用它不仅获取这段数据,而且进一步理解xpath查询。非常感谢。很乐意帮忙!当然,它确实有一个有趣的学习曲线,但幸运的是,我已经用它工作了足够长的时间(在不同的层次上),能够理解文档。我没有接受这个答案,但一旦我的声誉足够高,我无论如何都会投赞成票。请参阅下面我的评论,了解有效的代码。我敢打赌,如果我的XML和我在这里发布的完全一样,Z的答案肯定是正确的。这并不是最初的海报所要求的。我相信TecBrat已经能够使用这种技术。现在,他想用XPath来简化它。我尖锐地重新措辞了我的问题,并再次发布了它。我收到了这段代码,它起了作用:BrowseNodes/BrowseNode//BrowseNode[Name=“Categories”]
看起来我真正需要的是那个双斜杠。我现在已经能够使用一点点新知识进行几次类似的搜索。他:)哦,我省略了部分工作代码:BrowseNodes/BrowseNode//BrowseNode[Name=“Categories”]/祖先/BrowseNode/Name/text()
BrowserNodes/BrowserNode[Name=_______]/Ancestors/BrowserNode/Name/text()
<?php
$xmlString ="
<BrowseNodes>
<BrowseNode>
<Name>Category</Name>
<BrowseNodeId>123456</BrowseNodeId>
<Ancestors>
<BrowseNode>
<Name>Whatever</Name>
<BrowseNodeId>987654</BrowseNodeId>
</BrowseNode>
</Ancestors>
</BrowseNode>
<BrowseNode>
<Name>Category</Name>
<BrowseNodeId>123456</BrowseNodeId>
<Ancestors>
<BrowseNode>
<Name>Whatever</Name>
<BrowseNodeId>987654</BrowseNodeId>
</BrowseNode>
</Ancestors>
</BrowseNode>
</BrowseNodes>";
$result= simplexml_load_string($xmlString);
$counter =0;
$newArray=array();
foreach($result->BrowseNode as $arr) {
$newArray[$counter]['Name'] =(string)$arr->Name;
$newArray[$counter]['BrowseNodeId'] =(string)$arr->BrowseNodeId;
$newArray[$counter]['Ancestors']['Name'] =(string)$arr->Ancestors->BrowseNode->Name;
$newArray[$counter]['Ancestors']['BrowseNodeId'] =(string)$arr->Ancestors->BrowseNode->BrowseNodeId;
$counter++;
}
print"<pre>";
print_r($newArray);
die;
?>