2010-10-12 5 views
1

J'ai des données XML dans le format ci-dessous -Comment récupérer les enfants d'une donnée XML?

<xyz:reqResponse 
    xmlns:xyz="http://www.test.com/xyz/" 
    xmlns:akt="http://www.exmple.com/akt/"> 
    <xyz:version>1.2</xyz:version> 
    <xyz:totalRecords>659</xyz:totalRecords> 
    <xyz:records> 
    <xyz:record> 
     <doc> 
      <str name="icon_url">http://www.icons.net/icon1.jpg</str> 
      <str name="type">Service</str> 
      <arr name="bc.recordTitle"><str>Evergreen Club</str></arr> 
      <str name="bc.id">KLM0078</str> 
      <str name="system.external.id">787678</str> 
      <arr name="bc.description"> 
       <str>Meetings: Church Hall Beaudesert Lane. Open to anyone over 50.</str> 
      </arr> 
      <str name="code">X1209</str> 
      <double name="localval1">-4.00006</double> 
      <double name="localval2">-7.00012</double> 
      <date name="timestamp">Wed Jun 02 21:19:33 BST 2010</date> 
     </doc> 
    </xyz:record> 
    <xyz:record> 
     <doc> 
      <str name="icon_url">http://www.icons.net/icon1.jpg</str> 
      <str name="type">Service</str> 
      <arr name="bc.recordTitle"><str>Evergreen Club</str></arr> 
      <str name="bc.id">KLM0078</str> 
      <str name="system.external.id">787678</str> 
      <arr name="bc.description"> 
       <str>Meetings: Church Hall Beaudesert Lane. Open to anyone over 50.</str> 
      </arr> 
      <str name="code">X1209</str> 
      <double name="localval1">-4.00006</double> 
      <double name="localval2">-7.00012</double> 
      <date name="timestamp">Wed Jun 02 21:19:33 BST 2010</date> 
     </doc> 
    </xyz:record> 
    </xyz:records> 
</xyz:reqResponse> 

je fais quelque chose comme

$xml = simplexml_load_string($xml_data);    
$namespaces = $xml->getNameSpaces(true); 
$data = $xml->children($namespaces['xyz']); 

donc si j'imprimer

echo $data->totalRecords; //outputs correctly 659 

Je suis en train de boucler à travers toutes les enregistrements et accéder à des champs individuels, mais n'ont aucune idée de comment faire cela.

J'ai essayé quelque chose comme

$records = $data->records; 
foreach($records as $record) { 
    echo print_r($record, true); 
} 

mais il n'y avait pas très utile.

Mes questions sont - - comment accéder à chaque <xyz:record> et ses sous-éléments (qui sont <str name="abc">NAbc</str> etc

Avec mes remerciements, Kay

+0

"il n'y avait pas très utile" - pouvez-vous nous dire ce qu'il imprimé (non testé.)? – LarsH

+0

@LarsH .. il a attiré ces .. SimpleXMLElement Objet ([record] => Tableau ([0] => SimpleXMLElement Object() [1] => SimpleXMLElement Object())) .. vides ceux donc pas utile – Kay

Répondre

2

Je voudrais utiliser la xpath() méthode:

$xml = simplexml_load_string($xml_data); 

$xml->registerXPathNamespace('xyz', 'http://www.test.com/xyz/'); 

$recordArr = $xml->xpath('/xyz:reqResponse/xyz:records/xyz:record'); 

foreach($recordArr as $record) { 
    $strArr = $record->xpath('doc/str'); 

    foreach($strArr as $str) { 
     do what you want with $str 
    } 
} 

+0

Merci fonctionne comme prévu. À votre santé! – Kay

1

Lorsque vous sélectionnez $data->records vous sélectionnez tous records éléments, pas? record, je pense que vous devriez utiliser $data->records->record pour iter tous les éléments record.

$records = $data->records->record; 
foreach($records as $record){ 
    $doc = $record->doc; 
    //Now here you can access all str elements itering through $doc->str elements. 
} 

Voici par exemple PHP: SimpleXMLElement

Mise à jour (Comme on dit en Italie: « Vous ne cessez jamais d'apprendre »)

Vous pouvez accéder à des éléments XML comme des objets que si elles partagent le même espace de noms, vous pouvez faire ceci:

$docsCollection = $record->children(); //This will retrieve children within default namespace 
$strCollection = $docs->doc->str; //Now we are in the same namespace and can reuse above notation 

Juste pour l'enregistrement.

+0

Bonne capture , en ce qui concerne l'élément '' par rapport aux éléments ''. – LarsH

+0

désolé pour les données XML ci-dessus, il ne displays- SimpleXMLElement Object ( ) SimpleXMLElement Object ( ) – Kay

+0

pris acte. Il semble que j'ai quelques problèmes avec les espaces de noms. – Minkiele

Questions connexes