2.2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Ich habe eine Funktion, der ich den Pfad übergeben möchte, der angibt, an welcher Stelle ein neuer Inhalt in die XML-Datei gespeichert werden soll ($xml_pfad):

function speicher_text($bezeichnung, $xml_pfad)
{
if (isset($_POST[$bezeichnung]))
{
$inhalt = $_POST[$bezeichnung];
$xml = simplexml_load_file('../xml/inhalt.xml');
$xml->$xml_pfad = $inhalt;
$xml->asXML('../xml/inhalt.xml');
}
}

Ich hatte gehofft, das könnte man dann in etwa so aufrufen:

speicher_text('inhalt', seite1->thema1->inhalt);

Das funktioniert aber nicht, weil "->" Probleme bereitet, auch wenn ich alles in Anführungszeichen setze.

Wie kann ich so einen Pfad übergeben?

7 Antworten

0 Punkte
Beantwortet von macgyver031 Experte (2k Punkte)
Wie wäre es mit

"seite1->thema1->inhalt"
0 Punkte
Beantwortet von
Das klappt auch nicht. Das wird als 1 String erkannt.
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Du benötigst vermutlich XPath.

Mehr zu XPath
0 Punkte
Beantwortet von
So funktioniert es aber nicht:

$xml->xpath('seite1/thema1/inhalt') = $inhalt;

Fatal error: Can't use method return value in write context


Und auch so funktioniert es nicht:

$i = $xml->xpath('seite1/thema1/inhalt');
$i = $inhalt;

(es wird nichts gespeichert)


Wie soll das denn sonst mit XPath gemacht werden?
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Wenn du die Dokumentation aufmerksam gelesen hättest, wüßtest du, dass SimpleXMLElement::xpath() ein Array von passenden Nodes zurückgibt.

Lass dir doch mal zum Testen mit print_r() oder var_dump() ausgeben, was $xml->xpath() zurückgibt.
0 Punkte
Beantwortet von
Wie ich mit xpath Inhalte ausgebe ist mir jetzt klar, aber trotzdem weiß ich noch nicht, wie man Inhalte ändert. Ich will ja nichts aus der xml-Datei lesen, sondern was neu hineinschreiben bzw. ändern. Das steht, soweit ich das sehe, nicht in der Dokumentation. Kann mir bitte jemand sagen, wie das geht?
0 Punkte
Beantwortet von rabies Einsteiger_in (13 Punkte)
Ich möchte nachträglich noch meinen Senf dazugeben:

Mit SimpleXML wirst Du bei der Anforderung nicht glücklich. Selbst, wenn Du schon mit XPath die richtige Ergebnismenge
erhälst, bringt Dir das gar nichts - denn die von der Methode xpath zurückgelieferten Objekte vom Typ
SimpleXMLElement sind hinsichtlich Ihres Inhaltes read-
only.

An dieser Stelle sei auf die weitaus flexiblere XML-Verarbeitung mithilfe der
DOMDocument-Klasse von PHP verwiesen.

Hier ein Beispiel:

<?php

header('Content-Type: text/html; charset=UTF-8');

$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<seite1>
<thema1>Das ist das Thema Nr. 1 der 1. Seite</thema1>
</seite1>
<seite2>
<thema1>Das ist das Thema Nr. 1 der 2. Seite</thema1>
</seite2>
</root>
XML;

$path = filter_input(INPUT_POST, 'path', FILTER_SANITIZE_SPECIAL_CHARS);
$content = filter_input(INPUT_POST, 'content', FILTER_SANITIZE_SPECIAL_CHARS);

if ( null !== $path && false !== $path ) {
$xml = new DOMDocument;
$xml->formatOutput = true;
$xml->preserveWhitespace = true;
$xml->loadXML($xmlString);

$xpath = new DOMXPath($xml);
$nodes = $xpath->query($path);
$nodesLength = $nodes->length;

for ( $i = 0; $i < $nodesLength; $i++ ) {
$nodes->item($i)->nodeValue = $content;
}

$xmlString = $xml->saveXML();
}

?>
<pre><?= htmlentities($xmlString, ENT_QUOTES, 'UTF8'); ?></pre>

<form action="" method="post">
<strong>Pfad</strong><br />
<input type="text" name="path" value="<?= htmlentities($path, ENT_QUOTES, 'UTF8'); ?>" /><br />

<strong>Inhalt</strong><br />
<input type="text" name="content" value="" /><br />

<input type="submit" name="parsen" value="Inhalt ändern" />
</form>


Grüße,
rabies
...