Php 从所有同名子级的树中获取最后一个XML子级

Php 从所有同名子级的树中获取最后一个XML子级,php,xml,Php,Xml,我正在努力解析此XML结构: <BrowseNodes> <BrowseNode> <BrowseNodeId>6388960011</BrowseNodeId> <Name>Road Bike Frames</Name> <Ancestors> <BrowseNode> <Brows

我正在努力解析此XML结构:

<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允许您从文档中获取特定节点。在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'));

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