2010-11-26 7 views
-3

Ich verwende SimpleXML zum Parsen von XMl-Dokumenten. Ich muss Knotenattribute lesen/aktualisieren können.PHP: XML Parsing Frage

In diesem XML-Dokument

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

Wie kann ich alle wichtigen Knoten lesen/aktualisieren? Das Dokument hat keine spezifische Struktur, daher muss ich in der Lage sein, sie zu finden, ohne ihre Position zu kennen. Nehmen wir an, ich möchte die Zahlen in den Schlüsselknoten mit 2 multiplizieren. Wie kann ich es tun?

Tks.

+2

Ist Ihr Name "Fast-dev", weil Sie alle Ihre Code geschrieben Paketüberfluss? ;) –

+0

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

+4

@Orbling eine Menge Fragen zu stellen ist OK, es ist nur besser, wenn sie bestimmte Fragen sind und nicht schreiben-mich-ein-Bündel -of-code one – cambraca

Antwort

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, aber das verwendet nicht SimpleXml wie gewünscht (obwohl ich DOM auch besser mag) und es multipliziert auch nicht die Schlüsselelementwerte mit zwei und zum Hinzufügen der Zeichenkette 'Ersetzt' zu dem vorhandenen Ganztext, können Sie einfach '$ Knoten-> AnhangDaten (' Ersetzt ') verwenden; 'anstatt den gesamten Knoten durch ein Fragment zu ersetzen . Aber im Grunde brauchen Sie nicht einmal die Textknoten abzufragen, sondern nur die Schlüsselelemente und ändern ihren Knotenwert. – Gordon

+0

@Gordon Danke - Ich lerne gerade DOM und XML, weißt du;) –

+0

Ich weiß, ich weiß. Deshalb habe ich die Details hinzugefügt. Aber der Hauptgrund, auf den ich hinweise, ist, weil das OP akzeptiert hat, wenn es etwas ganz anderes zu sein scheint als gefragt. Aber das ist StackOverflow :) – Gordon

1

Die einfachste mögliche API ist QueryPath (oder phpQuery):

$qp = qp($xml); 

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

Aber etwas Ähnliches ist möglich, mit "SimpleXML"