2012-02-12 5 views
2

Comment trouver la valeur de nœud en connaissant la valeur de l'attribut sans traverser chaque enfant et chaque attribut/valeur?Sélectionner un nœud xml par attribut dans php

$dom = new DOMDocument; 
$dom->load('test.xml'); 

$rows = $dom->getElementsByTagName('row'); 

foreach ($rows as $row) { 

$header = VALUE OF <field name="header"> 
$text = VALUE OF <field name="text"> 

} 

XML:

<resultset> 
    <row> 
    <field name="item">2424</field> 
    <field name="header">blah blah 1</field> 
    <field name="text" xsi:nil="true" /> 
    ... 
    </row> 

    <row> 
    <field name="item">5321</field> 
    <field name="header">blah blah 2</field> 
    <field name="text">some text</field> 
    ... 
    </row> 
</resultset> 
+0

Vous ne pouvez pas ... Même si vous utilisez une bibliothèque, à l'arrière, il va falloir traverser l'arbre pour trouver ce que vous cherchez . –

Répondre

4

La chose la plus simple à faire est d'utiliser DOMXPath::querydocs

Le code suivant trouve tous les <field> nœuds au sein <row> noeuds qui ont un nom d'attribut égal à "tête":

$dom = new DOMDocument; 
$dom->loadXML($str); // where $str is a string containing your sample xml 
$xpath = new DOMXPath($dom); 
$query = "//row/field[@name='header']"; 

$elements = $xpath->query($query); 

foreach ($elements as $field) { 
    echo $field->nodeValue, PHP_EOL; 
} 

Utilisation du sampl e xml que vous fournissez, les sorties ci-dessus:

blah blah 1 
blah blah 2 
+0

Je pensais aussi à xpath mais cela me permettrait seulement de sélectionner un champ? J'ai besoin de plusieurs variables pour chaque "ligne" – user1070125

+0

Je ne sais pas si c'est ce que vous demandez, mais vous pouvez simplement empiler les conditions d'attribut comme suit: '$ query =" // row/field [@ name = 'header'] [@ other_attr = 'anything'] ";' Si vous demandez si vous pouvez saisir plusieurs types d'éléments avec un seul xpath, alors non. Vous pouvez faire plusieurs requêtes xpath ou les parcourir toutes. Désolé si c'est ce que vous demandiez en premier lieu. * "trouver la valeur du nœud en connaissant la valeur de l'attribut" * - ce qui est ce que votre question dit - est une situation xpath, cependant. – rdlowrey

Questions connexes