2010-12-07 15 views
0

Ich brauche etwas PHP/Xpath Hilfe. Kann jemand mir Beispielcode geben, um zu folgen?PHP XPath: Wie bekomme ich Element-Inhalte?

Im Folgenden finden Sie ein XML-Snippet von Amazon Web Service zu den Kategorien eines Buchs (in diesem Fall fällt das Buch in 2 Kategorien). Ich habe versucht, diesen Baum zu gehen, um die Informationen zu bekommen, die ich brauche, in dem Format, das ich will, aber hatte nicht viel Erfolg (war mit SimpleXMLElement).

Das Ergebnis ich brauche, ist ein verschachteltes, assoziatives Array, das wie folgt aussieht:

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

Hier ist der 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

Sie sprechen von Deserialisierung oder Klassengemeinschaft (Array in diesem Fall), aber sie nichts in Frage zu XPath sagen ... –

Antwort

0

es herausgefunden:

$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

Sie es tun können, den hart Weg.

Sie können the result here sehen.

<? 
$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

der Code es wird davon ausgegangen ist eine bestimmte Tiefe der Kategorien? Das ist nicht der Fall. – StackOverflowNewbie

+0

@StackOverflowNewbie: Was ist dann die mögliche Tiefe/Differenz? Ich kenne keine Amazon WS XML-Spezifikationen. – Shikiryu