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