xpath从嵌套元素中获取数据

时间:2012-02-08 03:50:59

标签: php xpath

我正在开发与亚马逊产品广告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
        )

)

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您只想获得节点:

BrowserNodes/BrowserNode[Name=_______]/Ancestors/BrowserNode/Name

如果您想获取节点的文本:

BrowserNodes/BrowserNode[Name=_______]/Ancestors/BrowserNode/Name/text()

在这两个示例中,将 _ 替换为您要搜索的名称。

答案 1 :(得分:-1)

查找以下示例:

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