2016-11-08 122 views
0

我挣扎解析这个XML结构树获取最新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> 

正如你可以看到,每个子元素具有相同的名称。我见过一些使用Xpath等的例子......但似乎无法将我的头围绕在它周围。此外,我已经尝试过计算孩子,但显然这只是第一级......所以没有骰子。同样只是试图查看所有的孩子(假设$节点是基于上述xml的BrowseNodes)。

理想情况下,我想直接在<IsCategoryRoot>1</IsCategoryRoot>之下抓取BrowseNode。再次,我的第一个想法是数数孩子,但它坚持在第一级。

foreach($nodes->BrowseNode->children() as $child) { 
    echo $child->getName() . "<br>"; 
} 

任何帮助表示赞赏。我确定我错过了一些简单的东西。

这里是返回什么时候产品SimpleXML中(记住我已经在这一点SimpleXML对象的工作 - 比如我访问这个作为$ whateverItem-> BrowseNodes:

object(SimpleXMLElement)#6 (1) { 
    ["BrowseNode"]=> 
    object(SimpleXMLElement)#5 (3) { 
    ["BrowseNodeId"]=> 
    string(7) "3403551" 
    ["Name"]=> 
    string(19) "Resistance Trainers" 
    ["Ancestors"]=> 
    object(SimpleXMLElement)#9 (1) { 
     ["BrowseNode"]=> 
     object(SimpleXMLElement)#10 (3) { 
     ["BrowseNodeId"]=> 
     string(10) "6389526011" 
     ["Name"]=> 
     string(27) "Bike Trainers & Accessories" 
     ["Ancestors"]=> 
     object(SimpleXMLElement)#11 (1) { 
      ["BrowseNode"]=> 
      object(SimpleXMLElement)#12 (3) { 
      ["BrowseNodeId"]=> 
      string(7) "3403201" 
      ["Name"]=> 
      string(7) "Cycling" 
      ["Ancestors"]=> 
      object(SimpleXMLElement)#13 (1) { 
       ["BrowseNode"]=> 
       object(SimpleXMLElement)#14 (3) { 
       ["BrowseNodeId"]=> 
       string(9) "706814011" 
       ["Name"]=> 
       string(18) "Outdoor Recreation" 
       ["Ancestors"]=> 
       object(SimpleXMLElement)#15 (1) { 
        ["BrowseNode"]=> 
        object(SimpleXMLElement)#16 (4) { 
        ["BrowseNodeId"]=> 
        string(7) "3375301" 
        ["Name"]=> 
        string(10) "Categories" 
        ["IsCategoryRoot"]=> 
        string(1) "1" 
        ["Ancestors"]=> 
        object(SimpleXMLElement)#17 (1) { 
         ["BrowseNode"]=> 
         object(SimpleXMLElement)#18 (2) { 
         ["BrowseNodeId"]=> 
         string(7) "3375251" 
         ["Name"]=> 
         string(17) "Sports & Outdoors" 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
object(SimpleXMLElement)#5 (1) { 
    ["BrowseNode"]=> 
    array(2) { 
    [0]=> 
    object(SimpleXMLElement)#3 (3) { 
     ["BrowseNodeId"]=> 
     string(7) "3403551" 
     ["Name"]=> 
     string(19) "Resistance Trainers" 
     ["Ancestors"]=> 
     object(SimpleXMLElement)#11 (1) { 
     ["BrowseNode"]=> 
     object(SimpleXMLElement)#12 (3) { 
      ["BrowseNodeId"]=> 
      string(10) "6389526011" 
      ["Name"]=> 
      string(27) "Bike Trainers & Accessories" 
      ["Ancestors"]=> 
      object(SimpleXMLElement)#13 (1) { 
      ["BrowseNode"]=> 
      object(SimpleXMLElement)#14 (3) { 
       ["BrowseNodeId"]=> 
       string(7) "3403201" 
       ["Name"]=> 
       string(7) "Cycling" 
       ["Ancestors"]=> 
       object(SimpleXMLElement)#15 (1) { 
       ["BrowseNode"]=> 
       object(SimpleXMLElement)#16 (3) { 
        ["BrowseNodeId"]=> 
        string(9) "706814011" 
        ["Name"]=> 
        string(18) "Outdoor Recreation" 
        ["Ancestors"]=> 
        object(SimpleXMLElement)#17 (1) { 
        ["BrowseNode"]=> 
        object(SimpleXMLElement)#18 (4) { 
         ["BrowseNodeId"]=> 
         string(7) "3375301" 
         ["Name"]=> 
         string(10) "Categories" 
         ["IsCategoryRoot"]=> 
         string(1) "1" 
         ["Ancestors"]=> 
         object(SimpleXMLElement)#19 (1) { 
         ["BrowseNode"]=> 
         object(SimpleXMLElement)#20 (2) { 
          ["BrowseNodeId"]=> 
          string(7) "3375251" 
          ["Name"]=> 
          string(17) "Sports & Outdoors" 
         } 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    [1]=> 
    object(SimpleXMLElement)#10 (3) { 
     ["BrowseNodeId"]=> 
     string(11) "11130424011" 
     ["Name"]=> 
     string(27) "Outdoor Recreation Features" 
     ["Ancestors"]=> 
     object(SimpleXMLElement)#11 (1) { 
     ["BrowseNode"]=> 
     object(SimpleXMLElement)#12 (2) { 
      ["BrowseNodeId"]=> 
      string(7) "3375251" 
      ["Name"]=> 
      string(17) "Sports & Outdoors" 
     } 
     } 
    } 
    } 
} 
+0

尝试递归函数,测试,如果有孩子回叫功能如果不返回结果 – Fky

回答

0

我觉得你可以做递归性,我不知道有关对象的方法,但也许你可以尝试这样的事情:

$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); 
2

XPath允许你从文档获取特定节点的SimpleXML SimpleXMLElement::xpath()允许你使用Xpath表达式。结果始终是一组SimpleXMLElement对象(用于有效表达式)。表达取决于你如何定义'最后'。

在任何级别的文件中的最后一个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')); 
+0

所以,在这一刻我已经用SimpleXML对象工作(让叫它$等等)。所以,我已经作为$ whatever-> BrowseNodes访问BrowseNodes,然后运行$ whatever-> BrowseNodes-> xpath('// BrowseNodes')例如,我只得到2个空数组。这很令人沮丧。我已经更新了上面的问题以显示完整的xml响应和SimpleXML对象。我只是不知道为什么当我尝试使用xpath() – Alpinestar22

+0

''''是文档中的任何节点时,为什么我会得到这么多空数组,在表达式开始处的斜杠意味着它在上下文中文件。彼此之后的两根斜线表示所有后代(不仅是孩子)。一个点是当前节点,所以'.//'是当前节点的后代。您需要使用它来将您的SimpleXMLElement引用的元素节点考虑在内。但是你目前的错误可能是你访问'BrowseNodes'而不是'BrowseNode'。 – ThW