2012-02-08 43 views
0

如果这个代码:PHP XPath语法

$s = 'BrowseNodes/BrowseNode'; 
$temp_bnid=$item->xpath($s); 
echo '<pre> 
Root Search: 
'; 
print_r($temp_bnid); 
echo '</pre>'; 
die('Halted for testing'); 

给出了这样的输出:

Root Search: 
Array 
(
    [0] => SimpleXMLElement Object 
     (
      [BrowseNodeId] => 2522032011 
      [Name] => Balls 
      [Ancestors] => SimpleXMLElement Object 
       (
        [BrowseNode] => SimpleXMLElement Object 
         (
          [BrowseNodeId] => 196601011 
          [Name] => Baby & Toddler Toys 
          [Ancestors] => SimpleXMLElement Object 
           (
            [BrowseNode] => SimpleXMLElement Object 
             (
              [BrowseNodeId] => 165795011 
              [Name] => Categories 
              [IsCategoryRoot] => 1 
              [Ancestors] => SimpleXMLElement Object 
               (
                [BrowseNode] => SimpleXMLElement Object 
                 (
                  [BrowseNodeId] => 165793011 
                  [Name] => Toys & Games 
                ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

Halted for testing 

和验证码:

$s = 'BrowseNodes/BrowseNode[Name=Categories]'; 
// I also tried $s = 'BrowseNodes/BrowseNode[Name="Categories"]'; 
$temp_bnid=$item->xpath($s); 
echo '<pre> 
Root Search: 
'; 
print_r($temp_bnid); 
echo '</pre>'; 
die('Halted for testing'); 

给出了这样的输出:

Root Search: 
Array 
(
) 

Halted for testing 

我在做什么错误,当我试图让包含“Name”节点的“Name”节点值为“Categories”的BrowseNode节点? 这个问题的另一种解决方案是选择存在“IsCategoryRoot”节点的节点,但我真的想了解如何执行其他查询,因为它可能会在未来帮助我更多。 Niether的方式与我处理的查询有关。

+0

发布你想搜索可能比SimpleXML的对象的转储更有帮助的XML。 – 2012-02-08 16:57:02

+0

您能举一个XML输入样本吗?帮助你会更容易。但给我看到:也许名称是一个属性,如果是这样,你可以尝试:'BrowseNodes/BrowseNode [@ Name =“Categories”]'。 – 2012-02-08 17:00:57

回答

1

我不确定,因为我无法有效地阅读SimpleXML转储,但我认为您拥有的是名为包含“Categories”的名为Name的子任意后代。因此,像:

BrowseNodes/BrowseNode//BrowseNode[Name="Categories"]

+0

谢谢。那就是诀窍。所以这是表明未知深度的双斜线,我确实需要“类别”的引号。我想我明白了。我试图点击向上箭头标记这个答案有帮助,但我没有足够的声望。 – TecBrat 2012-02-08 18:08:42

+0

太棒了!如果它是正确的,你可以点击勾来接受答案是正确的。 – 2012-02-08 23:53:27

+0

谢谢。我认为这就是上下选票的原因。 (尽管我已经从中获得了几年的答案,但实际上在这个论坛上发布的新品牌)。 – TecBrat 2012-02-09 03:04:25

1

你尝试过吗?

$s="BrowseNodes/BrowseNode/Name[text()='Categories']/.."; 

哪个应该选择父节点(ie:browseNode)作为文本是类别的Name节点。