Php 从所有同名子级的树中获取最后一个XML子级
我正在努力解析此XML结构:Php 从所有同名子级的树中获取最后一个XML子级,php,xml,Php,Xml,我正在努力解析此XML结构: <BrowseNodes> <BrowseNode> <BrowseNodeId>6388960011</BrowseNodeId> <Name>Road Bike Frames</Name> <Ancestors> <BrowseNode> <Brows
<BrowseNodes>
<BrowseNode>
<BrowseNodeId>6388960011</BrowseNodeId>
<Name>Road Bike Frames</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>1266090011</BrowseNodeId>
<Name>Bike Frames</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>3403201</BrowseNodeId>
<Name>Cycling</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>706814011</BrowseNodeId>
<Name>Outdoor Recreation</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>3375301</BrowseNodeId>
<Name>Categories</Name>
<IsCategoryRoot>1</IsCategoryRoot>
<Ancestors>
<BrowseNode>
<BrowseNodeId>3375251</BrowseNodeId>
<Name>Sports & Outdoors</Name>
</BrowseNode>
</Ancestors>
</BrowseNode>
</Ancestors>
</BrowseNode>
</Ancestors>
</BrowseNode>
</Ancestors>
</BrowseNode>
</Ancestors>
</BrowseNode>
<BrowseNode>
<BrowseNodeId>11130424011</BrowseNodeId>
<Name>Outdoor Recreation Features</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>3375251</BrowseNodeId>
<Name>Sports & Outdoors</Name>
</BrowseNode>
</Ancestors>
</BrowseNode>
</BrowseNodes>
我想你可以做递归,我不确定对象的方法,但也许你可以试试这样的方法:
$childs = $nodes->BrowseNode;
function recursiveParse($node){
foreach($node->children() as $child) {
echo $child->getName() . "<br>";
$ances = $child->getAncestors();
if($ances !== NULL) recursiveParse($ances->BrowseNode);
}
}
recursiveParse($childs);
$childs=$nodes->BrowseNode;
函数recursiveParse($node){
foreach($node->children()作为$child){
echo$child->getName()。“
”;
$acents=$child->get祖先();
如果($encies!==NULL)递归解析($encies->BrowseNode);
}
}
递归解析($childs);
我认为您可以实现递归性,我不确定object的方法,但也许您可以尝试以下方法:
$childs = $nodes->BrowseNode;
function recursiveParse($node){
foreach($node->children() as $child) {
echo $child->getName() . "<br>";
$ances = $child->getAncestors();
if($ances !== NULL) recursiveParse($ances->BrowseNode);
}
}
recursiveParse($childs);
$childs=$nodes->BrowseNode;
函数recursiveParse($node){
foreach($node->children()作为$child){
echo$child->getName()。“
”;
$acents=$child->get祖先();
如果($encies!==NULL)递归解析($encies->BrowseNode);
}
}
递归解析($childs);
Xpath允许您从文档中获取特定节点。在SimpleXMLSimpleXMLElement::xpath()
中,允许您使用xpath表达式。结果始终是SimpleXMLElement对象的数组(对于有效表达式)。表达式取决于您如何定义“last”
文档中任意级别的最后一个BrowseNode
元素:
$nodes = new SimpleXMLElement($xml);
var_dump($nodes->xpath('(//BrowseNode)[last()]'));
最深层的“BrowseNode”元素(可能有多个)。基本上,“BrowseNode”元素没有具有该名称的后代:
$nodes = new SimpleXMLElement($xml);
var_dump($nodes->xpath('//BrowseNode[not(.//BrowseNode)]'));
当然,您也可以获得具有值为1的子IsCategoryRoot的所有节点。从那里可以获取其中的BrowseNode:
$nodes = new SimpleXMLElement($xml);
var_dump($nodes->xpath('//BrowseNode[IsCategoryRoot=1]/Ancestors/BrowseNode'));
Xpath允许您从文档中获取特定节点。在SimpleXML
SimpleXMLElement::xpath()
中,允许您使用xpath表达式。结果始终是SimpleXMLElement对象的数组(对于有效表达式)。表达式取决于您如何定义“last”
文档中任意级别的最后一个BrowseNode
元素:
$nodes = new SimpleXMLElement($xml);
var_dump($nodes->xpath('(//BrowseNode)[last()]'));
最深层的“BrowseNode”元素(可能有多个)。基本上,“BrowseNode”元素没有具有该名称的后代:
$nodes = new SimpleXMLElement($xml);
var_dump($nodes->xpath('//BrowseNode[not(.//BrowseNode)]'));
当然,您也可以获得具有值为1的子IsCategoryRoot的所有节点。从那里可以获取其中的BrowseNode:
$nodes = new SimpleXMLElement($xml);
var_dump($nodes->xpath('//BrowseNode[IsCategoryRoot=1]/Ancestors/BrowseNode'));
尝试一个递归函数,测试是否有子调用函数,如果没有返回结果,尝试一个递归函数,测试是否有子调用函数,如果没有返回结果,那么,现在我已经在处理一个SimpleXML对象(让我们称它为$which)。因此,我已经以$whater->BrowseNodes的形式访问了BrowseNodes,然后运行$whater->BrowseNodes->xpath('//BrowseNodes')。例如,我只得到了两个空数组。这相当令人沮丧。我已经更新了上面的问题,以显示完整的xml响应和SimpleXML对象。我只是不知道为什么当我尝试使用xpath()时会得到这么多空数组。
/
是文档中的任何节点,表达式开头的斜杠表示它在文档上下文中。后面两个斜杠表示所有子代(不仅仅是子代)。点是当前节点,因此/
是当前节点的任何后代。您需要使用它来考虑SimpleXMLElement引用的元素节点。但您当前的错误可能是访问BrowseNodes
而不是BrowseNode
。因此,现在我已经在处理一个SimpleXML对象(我们称它为$which)。因此,我已经以$whater->BrowseNodes的形式访问了BrowseNodes,然后运行$whater->BrowseNodes->xpath('//BrowseNodes')。例如,我只得到了两个空数组。这相当令人沮丧。我已经更新了上面的问题,以显示完整的xml响应和SimpleXML对象。我只是不知道为什么当我尝试使用xpath()时会得到这么多空数组。/
是文档中的任何节点,表达式开头的斜杠表示它在文档上下文中。后面两个斜杠表示所有子代(不仅仅是子代)。点是当前节点,因此/
是当前节点的任何后代。您需要使用它来考虑SimpleXMLElement引用的元素节点。但您当前的错误可能是访问BrowseNodes
而不是BrowseNode
。