Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php xpath从嵌套元素中获取数据_Php_Xpath - Fatal编程技术网

Php xpath从嵌套元素中获取数据

Php xpath从嵌套元素中获取数据,php,xpath,Php,Xpath,我正在开发一个与亚马逊产品广告API的接口 我有一个XML,其中包含一个类似于以下内容的部分: <BrowseNodes> <BrowseNode> <Name>Category</Name> <BrowseNodeId>123456</BrowseNodeId> <Ancestors> <BrowseNode> <Name>

我正在开发一个与亚马逊产品广告API的接口

我有一个XML,其中包含一个类似于以下内容的部分:

<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;
?>