2010-12-07 4 views
0

Мне нужна помощь PHP/Xpath. Может ли кто-нибудь дать мне образец кода?PHP XPath: Как получить содержимое элемента?

Ниже приведен фрагмент XML из веб-сервиса Amazon, относящийся к категориям книг (в этом случае книга подпадает под 2 категории). Я пробовал это дерево, чтобы получить нужную мне информацию в формате, который я хочу, но не имел большого успеха (использовал 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

Смежные вопросы