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