2010-12-07 31 views
0

J'ai besoin d'aide PHP/Xpath. Quelqu'un peut-il me donner un exemple de code à suivre? Ce qui suit est un extrait de XML d'Amazon Web Service appartenant aux catégories d'un livre (dans ce cas, le livre relève de 2 catégories). J'ai essayé de marcher dans cet arbre pour obtenir l'information dont j'avais besoin dans le format que je voulais, mais je n'avais pas beaucoup de succès (j'utilisais SimpleXMLElement).PHP XPath: Comment obtenir le contenu de l'élément?

Le résultat est que j'ai besoin d'un tableau imbriqué, associatif qui ressemble à ceci:

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

Voici le 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

Vous parlez de la population désérialisation ou classe (Array dans ce cas), mais vous dites rien dans votre question sur XPath ... –

Répondre

0

figured it out:

$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

Vous pouvez le faire de la façon difficile.

Vous pouvez voir 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

le code suppose qu'il est une profondeur spécifique aux catégories? Ce n'est pas le cas. – StackOverflowNewbie

+0

@StackOverflowNewbie: Alors, quelles sont la profondeur/différence possible? Je ne connais pas les spécifications XML Amazon WS. – Shikiryu