xpath,用于从嵌套元素中获取数据


xpath to get data out of nested element

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

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

<BrowseNodes>
  <BrowseNode>
     <Name>Category</Name>
     <BrowseNodeId>123456</BrowseNodeId>
     <Ancestors>
       <BrowseNode>
         <Name>Whatever</Name>
        <BrowseNodeId>987654</BrowseNodeId>
       <BrosweNode>
     </Ancestors>
  </BroseNode>
  <BroseNode>
  ...
  </BrowseNode>
</BrowseNodes>

我必须仔细检查我的 XML。 除了我上面发布的第一个<BrowseNode>之外,可能还有一个级别的<BrowseNode> </BrowseNode>

我需要找到祖先元素内的<BrowseNode> <Name>,其中<Ancestors>元素是<Name>类别的同级</Name>

我刚刚开始使用 xpath,这超出了我的头脑。

我一直在这样编码:

//$XML fromapi
$parsed=simplexml_load_string($XML);
//narrow it down
$s = '/ItemSearchResponse/Items/Item';
$items = $parsed->xpath($s);
//Get only the top level BrowseNodes for this item.
foreach($items as $item)
  {
    // this narrows it down close to what I posted above.
    $s = 'BrowseNodes/BrowseNode';
    $top_browsenode_search=$item->xpath($s);
      //there may be a simpler way, but I think it is working for me:
      foreach ($top_browsenode_search as $top_browsenode)
        {
          $temp_array=array();//must be emptied each time.
          $s = 'Name';
          $temp_array['name']=$top_browsenode->xpath($s);
          $s = 'BrowseNodeId';
          $temp_array['id']=$top_browsenode->xpath($s);
      $browsenodes[]=$temp_array;
        }
    $top_browsenodes[]=$browsenodes;
    unset ($browsenodes);        
  }    

有人能够帮助使用xpath语法吗?如果不是直接的,你能指出我你知道的任何新手友好的文档吗?我下载了一本关于这个主题的好书,我从中学到了很多东西,但它有点超出我的头脑。

下面不是问题的一部分,而是其中一个答案是正确的证据。有关详细信息,请参阅评论。预期成果:"无论什么" 给定成果:"无论什么">

<?xml version="1.0" ?>
<root>
<BrowseNodes>
  <BrowseNode>
     <Name>Category</Name>
     <BrowseNodeId>123456</BrowseNodeId>
     <Ancestors>
       <BrowseNode>
         <Name>Whatever</Name>
         <BrowseNodeId>987654</BrowseNodeId>
       </BrowseNode>
     </Ancestors>
  </BrowseNode>
  <BrowseNode>
     <Name>SomethingElse</Name>
     <BrowseNodeId>951753</BrowseNodeId>
  </BrowseNode>
</BrowseNodes>
</root>
BrowseNodes/BrowseNode/Name
Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => Category
        )
    [1] => SimpleXMLElement Object
        (
            [0] => SomethingElse
        )
)
BrowseNodes/BrowseNode[Name="Category"]/Ancestors/BrowseNode/Name 
Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => Whatever
        )
)

谢谢!

如果只想获取节点:

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