2010-12-07 161 views
0

我需要一些PHP/Xpath的帮助。任何人都可以给我示例代码来遵循?PHP XPath:如何获取元素内容?

以下是亚马逊网络服务有关书籍类别(本例中该书属于2类)的XML片段。我试过走这棵树,以我想要的格式获取我需要的信息,但没有太大的成功(使用SimpleXMLElement)。

结果我需要的是一个嵌套的,关联数组是这样的:

[0] 
    - '11079' => 'Politics' 
    - '53' => 'Nonfiction' 
    - '1000' => 'Subjects' 
    - '283155' => 'Books' 
[1] 
    - '11232' => 'Social Sciences' 
    - '53' => 'Nonfiction' 
    - '1000' => 'Subjects' 
    - '283155' => 'Books' 

这里的XML:

<BrowseNodes> 
    <BrowseNode> 
     <BrowseNodeId>11079</BrowseNodeId> 
     <Name>Politics</Name> 
     <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>53</BrowseNodeId> 
       <Name>Nonfiction</Name> 
       <Ancestors> 
        <BrowseNode> 
         <BrowseNodeId>1000</BrowseNodeId> 
         <Name>Subjects</Name> 
         <IsCategoryRoot>1</IsCategoryRoot> 
         <Ancestors> 
          <BrowseNode> 
           <BrowseNodeId>283155</BrowseNodeId> 
           <Name>Books</Name> 
          </BrowseNode> 
         </Ancestors> 
        </BrowseNode> 
       </Ancestors> 
      </BrowseNode> 
     </Ancestors> 
    </BrowseNode> 
    <BrowseNode> 
     <BrowseNodeId>11232</BrowseNodeId> 
     <Name>Social Sciences</Name> 
     <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>53</BrowseNodeId> 
       <Name>Nonfiction</Name> 
       <Ancestors> 
        <BrowseNode> 
         <BrowseNodeId>1000</BrowseNodeId> 
         <Name>Subjects</Name> 
         <IsCategoryRoot>1</IsCategoryRoot> 
         <Ancestors> 
          <BrowseNode> 
           <BrowseNodeId>283155</BrowseNodeId> 
           <Name>Books</Name> 
          </BrowseNode> 
         </Ancestors> 
        </BrowseNode> 
       </Ancestors> 
      </BrowseNode> 
     </Ancestors> 
    </BrowseNode> 
</BrowseNodes> 
+0

你说的是反序列化或类人群(数组在这种情况下),但你说的话没有在你的XPath问题... – 2010-12-07 12:38:05

回答

0

想通了:

$categories = array(); 
$categories_count = count($simple_xml_emlement->xpath('//BrowseNodes/BrowseNode')); 
for($i = 1; $i <= $categories_count; $i++) 
{ 
    $category = array(); 
    $category_names = $simple_xml_emlement->xpath("//BrowseNodes/BrowseNode[$i]//Name"); 
    foreach($category_names as $category_name) 
    { 
     $category_id = $category_name->xpath('preceding-sibling::*'); 
     $category[(int)$category_id[0]] = (string) $category_name; 
    } 
    $categories[] = $category; 
} 
0

你可以做到这一点的方式。您可以看到the result here

<? 
$xml = '<BrowseNodes> 
    <BrowseNode> 
     <BrowseNodeId>11079</BrowseNodeId> 
     <Name>Politics</Name> 
     <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>53</BrowseNodeId> 
       <Name>Nonfiction</Name> 
       <Ancestors> 
        <BrowseNode> 
         <BrowseNodeId>1000</BrowseNodeId> 
         <Name>Subjects</Name> 
         <IsCategoryRoot>1</IsCategoryRoot> 
         <Ancestors> 
          <BrowseNode> 
           <BrowseNodeId>283155</BrowseNodeId> 
           <Name>Books</Name> 
          </BrowseNode> 
         </Ancestors> 
        </BrowseNode> 
       </Ancestors> 
      </BrowseNode> 
     </Ancestors> 
    </BrowseNode> 
    <BrowseNode> 
     <BrowseNodeId>11232</BrowseNodeId> 
     <Name>Social Sciences</Name> 
     <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>53</BrowseNodeId> 
       <Name>Nonfiction</Name> 
       <Ancestors> 
        <BrowseNode> 
         <BrowseNodeId>1000</BrowseNodeId> 
         <Name>Subjects</Name> 
         <IsCategoryRoot>1</IsCategoryRoot> 
         <Ancestors> 
          <BrowseNode> 
           <BrowseNodeId>283155</BrowseNodeId> 
           <Name>Books</Name> 
          </BrowseNode> 
         </Ancestors> 
        </BrowseNode> 
       </Ancestors> 
      </BrowseNode> 
     </Ancestors> 
    </BrowseNode> 
</BrowseNodes>'; 

$simplexml = simplexml_load_string($xml); 
$return = array(); 

foreach($simplexml->BrowseNode as $node){ 
$return[] = array(
    (string)$node->BrowseNodeId => (string)$node->Name, 
    (string)$node->Ancestors->BrowseNode->BrowseNodeId => (string)$node->Ancestors->BrowseNode->Name, 
    (string)$node->Ancestors->BrowseNode->Ancestors->BrowseNode->BrowseNodeId => (string)$node->Ancestors->BrowseNode->Ancestors->BrowseNode->Name, 
    (string)$node->Ancestors->BrowseNode->Ancestors->BrowseNode->Ancestors->BrowseNode->BrowseNodeId => (string)$node->Ancestors->BrowseNode->Ancestors->BrowseNode->Ancestors->BrowseNode->Name, 
); 
} 

print_r($return); 
+0

的代码假定有具体深度的类别?事实并非如此。 – StackOverflowNewbie 2010-12-07 11:54:13