PHP& XML - 计算节点的后代

时间:2014-06-02 14:08:35

标签: php xml

我正在使用亚马逊合作伙伴API来获取有关产品的一些信息。他们有一个XML元素来获取产品的类似物:

<BrowseNodes>
<BrowseNode>
    <BrowseNodeId>464711031</BrowseNodeId>
        <Name>Soutiens-gorge de tous les jours</Name>
        <Ancestors>
            <BrowseNode>
               <BrowseNodeId>464710031</BrowseNodeId>
               <Name>Soutiens-gorge</Name>
               <Ancestors>
                    <BrowseNode>
                        <BrowseNodeId>464709031</BrowseNodeId>
                        <Name>Lingerie</Name>
                        <Ancestors>
                            <BrowseNode>
                            <BrowseNodeId>436559031</BrowseNodeId>
                            <Name>Femme</Name>
                            <Ancestors>
                                <BrowseNode>
                                <BrowseNodeId>340856031</BrowseNodeId>
                                <Name>Catégories</Name>
                                <IsCategoryRoot>1</IsCategoryRoot>
                                <Ancestors>
                                    <BrowseNode>
                                    ...

等等。有时只有三个后代有时更多......

所以我的问题是,如果不用for循环猜测,我怎么能算出有多少后代呢?

我的第二个问题是,如何将下一个代码放入for循环中?我没有看到......

$cL = $item->BrowseNodes->BrowseNode;
if(isset($cL)){
    $catTree[] = (string)$cL->Name;
    $cL0 = $cL->Ancestors->BrowseNode;

    if(isset($cL0)){
    $catTree[] = (string)$cL0->Name;    
    $cL1 = $cL0->Ancestors->BrowseNode;

    if(isset($cL1)){
        $catTree[] = (string)$cL1->Name;
        $cL2 = $cL1->Ancestors->BrowseNode; 

        if(isset($cL2)){
                    $catTree[] = (string)$cL2->Name;
            $cL3 = $cL2->Ancestors->BrowseNode;

                        if(isset($cL3)){                    
                            $catTree[] = (string)$cL3->Name;    
                            ...

并且还继续......

实际上这段代码正在运行,但我确信它可能会更简单......只是不知道如何。

非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

要计算元素,您不需要使用循环。试试这个。

$xml = "<BrowseNodes>
            <BrowseNode>
               <BrowseNodeId>464710031</BrowseNodeId>
               <Name>Soutiens-gorge</Name>
            </BrowseNode>
            <BrowseNode>
               <BrowseNodeId>464710033</BrowseNodeId>
               <Name>Soutiens-gorge333</Name>
            </BrowseNode>
        </BrowseNodes>";

$xml = new SimpleXMLElement($xml);
$xml->xpath("/BrowseNode");
echo "count: ".$xml->count();

但是如果你想使用循环,那么在这种情况下它将不起作用。你需要递归,如@ 1nflktd

所述

答案 1 :(得分:2)

使用XPath:

$document = new DOMDocument(); 
$document->load( "your-file.xml" ); 
$xpath = new DOMXpath($document);

$count = $xpath->evaluate("count(/BrowseNodes//BrowseNode)");

您还可以使用XPath选择所有节点并提取所需的值。