2010-11-26 6 views
-3

J'utilise SimpleXML pour analyser des documents XMl. Je dois être capable de lire/mettre à jour les attributs de noeud.PHP: question d'analyse XML

Dans ce document XML

<root> 
    <node>ABC</node> 
    <key>123</key> 
    <node2> 
    <key>456</key> 
    </node2> 
    <key>789</key> 
</root> 

Comment puis-je lire/mettre à jour tous les nœuds clés? le document n'a pas de structure spécifique, je dois donc pouvoir les trouver sans connaître leur position. Disons que je veux multiplier par 2 les nombres dans les nœuds clés. Comment puis-je le faire?

Tks.

+2

est votre nom "-dev rapide" parce que vous avez tout votre code écrit sur Stack Overflow? ;) –

+0

DIY: http://php.net/manual/en/simplexmlelement.xpath.php –

+4

@Orbling poser beaucoup de questions est OK, c'est juste mieux si elles sont des questions spécifiques et ne pas écrire moi-un-bouquet -de-code – cambraca

Répondre

1
<?php 

$xml = '<root> 
    <node>ABC</node> 
    <key>123</key> 
    <node2> 
    <key>456</key> 
    </node2> 
    <key>789</key> 
</root>'; 

$dom = new DOMDocument(); 
$dom->loadXml($xml); 

$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//text()') as $node) 
{ 
$newNode = $dom->createDocumentFragment(); 
$newNode->appendXML($node->wholeText . ' replaced'); 
$node->parentNode->replaceChild($newNode, $node); 
} 

echo $dom->saveXML(); 
+0

Hmmm, mais cela n'utilise pas SimpleXml comme demandé (bien que j'aime mieux DOM aussi) et il ne multiplie pas non plus les valeurs des éléments clés par deux et pour ajouter la chaîne 'replace' au entierText existant, vous pouvez simplement utiliser $ node-> appendData ('replace'); 'au lieu de remplacer le noeud entier par un fragment . Mais fondamentalement, vous n'avez même pas besoin d'interroger les nœuds de texte, mais seulement les éléments clés et de changer leur nodeValue. – Gordon

+0

@Gordon Merci - Je suis en train d'apprendre DOM et XML, vous savez;) –

+0

Je sais, je sais. C'est pourquoi j'ai ajouté les détails. Mais la principale raison pour laquelle je le signale est que l'OP a accepté quand il semble que ce soit quelque chose de complètement différent de ce qui a été demandé. Mais c'est StackOverflow :) – Gordon

1

Le plus simple API possible est QueryPath (ou phpQuery):

$qp = qp($xml); 

foreach ($qp->find("key") as $key) { 
    //@todo: add verification that it's indeed numeric text 
    $key->text( $key->text() * 2 ); 
} 

Mais quelque chose de similaire est possible avec "SimpleXML"