2010-03-04 5 views
2

J'ai besoin d'interroger un document XML, puis d'afficher des valeurs de balises spécifiques, par ex. prénom, nom de famille, groupe (dept), job_title. J'utilise XMLReader car il se peut que je doive travailler avec de gros fichiers XML. J'utilise DomXPath pour filtrer les données, mais je ne sais pas comment récupérer le nodeName et la valeur de chaque élément. Le code ci-dessous ne renvoie que «membre» comme nom de noeud?Récupère le nom et la valeur d'un noeud donné en utilisant XMLReader, DOM, Xpath

Toute aide serait appréciée.

<?php 
    $reader = new XMLReader(); 
    $reader->open('include/staff.xml'); 

    while ($reader->read()){ 
     switch($reader->nodeType){ 
      case(XMLREADER::ELEMENT): 
       if($reader->localName === 'staff'){ 
        $node = $reader->expand(); 
        $dom = new DomDocument(); 
        $dom->formatOutput = true; 
        $n = $dom->importNode($node, true); 
        $dom->appendChild($n); 
        $xp = new DomXpath($dom); 
        $res = $xp->query("/staff/member[groups='HR']"); 
       } 
     } 
    } 
    echo $res->item(0)->nodeName; 
    echo $res->item(0)->nodeValue; 
?> 

Répondre

1

Encore un peu rude, mais ce que je suis après. J'ai compris que ma requête xpath causait le problème.

<?php 
$reader = new XMLReader(); 
$reader->open('include/staff.xml'); 
$keywords = ''; 
$query = "//member[groups='Research'][contains(translate(forename,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') ,'$keywords') or contains(translate(surname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), '$keywords')]/*"; 
while ($reader->read()){ 
    switch($reader->nodeType){ 
     case(XMLREADER::ELEMENT): 
      if($reader->localName === 'staff'){ 
       $node = $reader->expand(); 
       $dom = new DomDocument(); 
       $dom->formatOutput = true; 
       $n = $dom->importNode($node, true); 
       $dom->appendChild($n); 
       $xp = new DomXpath($dom); 
       $results = $xp->query($query); 
      } 
    } 
} 
$member = array(); 
$staff = array(); 
echo $results->length; 
for($i=1; $i<$results->length; $i++){ 
    if($results->item($i)->nodeName !== 'id'){ 
     $member[$results->item($i)->nodeName] = $results->item($i)->nodeValue; 
    }else{ 
     array_push($staff, $member); 
    } 
} 
array_push($staff, $member); 
var_dump($staff); 

?>

0

Essayez

$reader->name 

et

$reader->value 

Ils censés être "Le nom qualifié du nœud" et "La valeur texte du noeud", selon cette page http://www.php-editors.com/php_manual/ref.xmlreader.html

Apparemment, c'est comme ça que les gens l'utilisent: http://www.google.com/codesearch/p?hl=pl#_rn0kgFhkQA/redir/docvert/60463/url_tgz/docvert-3.2.3.tar.gz%7CP-uLGAoGHyM/docvert/core/process/ParseOpenDocument.php&q=xmlreader%20file:%5C.php

Peut-être que d'autres exemples d'utilisation sont disponibles ici: http://www.google.com/codesearch?q=xmlreader+file:.php $

+0

Est-ce que ces valeurs ne se fonder sur XMLReader? J'utilise DOM et XPath donc je pense que je dois utiliser les méthodes DOM, c'est-à-dire $ res-> item (1) -> nodeValue; pour obtenir mes résultats filtrés. Essayé $ lecteur-> nom ... de toute façon et rien n'a été retourné. – rossjha

+0

Ceci est censé être des propriétés de la classe XMLReader. Je pense que vous devriez voir quelque chose sous $ lecteur-> nom Essayez-le sur un exemple minimal. –

+0

Salut merci pour votre aide. Je pense que je l'ai. Ma question était le problème. Une fois que j'ai réussi à maîtriser xpath, j'ai pu retourner nodeName et nodeValue pour chacune des balises. – rossjha

Questions connexes