simplexml xpath read-only?
hoi,
dit is het verhaal: ik ben en plugin aan het maken voor whatever met een config dingetje in een xml bestand.
nu ben ik bezig daar een admin pagina voor te maken, bij he terug schrijven gebruik ik $item = $idealxml->xpath($path); om vervolgens de juiste waarde in $item te stoppen.
mijn erste gedachte was dat al dat simple xml spul by refference gaat, dus dat ik zo in item kan schrijven... blijkbaar niet, of ik doe iets fout.
en als ik iets probeer als $idealxml->xpath($path) = $value; krijg ik een error met PHP "Can’t use method return value in write context"
dit is ene klein stukje code:
in post zitten dingen in de vorm van item_name#3 die dus corresponderen met bijvoorbeeld dit element:
dit is het verhaal: ik ben en plugin aan het maken voor whatever met een config dingetje in een xml bestand.
nu ben ik bezig daar een admin pagina voor te maken, bij he terug schrijven gebruik ik $item = $idealxml->xpath($path); om vervolgens de juiste waarde in $item te stoppen.
mijn erste gedachte was dat al dat simple xml spul by refference gaat, dus dat ik zo in item kan schrijven... blijkbaar niet, of ik doe iets fout.
en als ik iets probeer als $idealxml->xpath($path) = $value; krijg ik een error met PHP "Can’t use method return value in write context"
dit is ene klein stukje code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
foreach($_POST as $id => $value) {
$item = explode('#', $id);
$item[0] = explode('_', $item[0]);
$path = '//'.$item[0][0].'['.(isset($item[1]) ? $item[1] : 1).']/'.$item[0][1];
$item = $xml->xpath($path);
$item = $value;
}
echo "<pre>";
echo htmlentities($xml->asXML()); // dit is dus de oude xml, zonder de veranderingen hierboven
echo "</pre>";
?>
foreach($_POST as $id => $value) {
$item = explode('#', $id);
$item[0] = explode('_', $item[0]);
$path = '//'.$item[0][0].'['.(isset($item[1]) ? $item[1] : 1).']/'.$item[0][1];
$item = $xml->xpath($path);
$item = $value;
}
echo "<pre>";
echo htmlentities($xml->asXML()); // dit is dus de oude xml, zonder de veranderingen hierboven
echo "</pre>";
?>
in post zitten dingen in de vorm van item_name#3 die dus corresponderen met bijvoorbeeld dit element:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<xml>
<item><name>deze niet...</name></item>
<item><name>deze niet...</name></item>
<item><name>deze wel, omdat dit nummer 3 is... xpath schijnt niet zero based te zijn</name></item>
<item><name>deze niet...</name></item>
</xml>
<item><name>deze niet...</name></item>
<item><name>deze niet...</name></item>
<item><name>deze wel, omdat dit nummer 3 is... xpath schijnt niet zero based te zijn</name></item>
<item><name>deze niet...</name></item>
</xml>
Gewijzigd op 01/01/1970 01:00:00 door Pepijn de vos
bump...
ik zit hier met een admin die niks doet :S
heeft verder geen super haast ofzo, ik kan nu gewoon in de xml rommelen, maar niet elke noob snapt dat ;)
de vraag samengevat is dus:
hoe kan ik een node uit een xml bestand halen door middel van xpath en vervolgens de waarde aanpassen en terug schrijven naar het xml bestand.
ik zit hier met een admin die niks doet :S
heeft verder geen super haast ofzo, ik kan nu gewoon in de xml rommelen, maar niet elke noob snapt dat ;)
de vraag samengevat is dus:
hoe kan ik een node uit een xml bestand halen door middel van xpath en vervolgens de waarde aanpassen en terug schrijven naar het xml bestand.
mag ik al wanhopig worden?
't duurt me nu een beetje lang.
werkt hier niemand met xml dat ik geen antwoord krijg, of wat is het probleem?
verkeerde topic titel?
slechte uitleg?
of weet niemand het antwoord?
als ik zo iets doe als dit: $xml->a->b = "iets" werkt dat gewoon.
als ik $temp = $xml->a->b doe, en vervolgens $temp = "iets" dan werkt dat wel als de referentie van $xml er in zit, maar niet als het de waarde is.
ik weet dat ik niet naar een return value kan schrijven, en ik weet ook vrij zeker dat het bij simplexml om een referentie naar het xml object gaat, daarom moet je ook altijd die dingen als string casten.
maar als ik dus de return value in een var stop en daar naar schrijf, waarom is het resultaat dan niet bijgewerkt?
of moet ik nog iets doen met =& om echt de referentie te bewerken?
't duurt me nu een beetje lang.
werkt hier niemand met xml dat ik geen antwoord krijg, of wat is het probleem?
verkeerde topic titel?
slechte uitleg?
of weet niemand het antwoord?
als ik zo iets doe als dit: $xml->a->b = "iets" werkt dat gewoon.
als ik $temp = $xml->a->b doe, en vervolgens $temp = "iets" dan werkt dat wel als de referentie van $xml er in zit, maar niet als het de waarde is.
ik weet dat ik niet naar een return value kan schrijven, en ik weet ook vrij zeker dat het bij simplexml om een referentie naar het xml object gaat, daarom moet je ook altijd die dingen als string casten.
maar als ik dus de return value in een var stop en daar naar schrijf, waarom is het resultaat dan niet bijgewerkt?
of moet ik nog iets doen met =& om echt de referentie te bewerken?
Edit:
http://nl2.php.net/manual/en/function.simplexml-element-xpath.php#56120
zie je wel, referenties... wat doe ik nou fout?
http://nl2.php.net/manual/en/function.simplexml-element-xpath.php#56120
zie je wel, referenties... wat doe ik nou fout?
Gewijzigd op 01/01/1970 01:00:00 door pepijn de vos
Quote:
als ik $temp = $xml->a->b doe, en vervolgens $temp = "iets" dan werkt dat wel als de referentie van $xml er in zit, maar niet als het de waarde is.
Kan je daar een werkend voorbeeld van geven? Dit mag ook niet werken, ookal zit er een instantie vam simplexml in, hij zal die instantie gewoon weggooien en vervangen door je string die je nu aan de variabele toewijst.
Tevens snap ik je probleem niet. Waarom wil je het eerst in een losse variabele zetten en vervolgens de waarde aanpassen? Dat is toch erg onoverzichtelijk en lelijk?
Ik kan me je probleem niet voorstellen. Ik gebruik het ook af en toe, simplexml is slecht gedocumenteerd, maar heb er nooit problemen mee.
Gewijzigd op 01/01/1970 01:00:00 door M Ypma
Ja... eerst maak je een variable aan, ...->xpath() geeft trouwens een array met nodes terug... daarna ga je in die variabele iets anders zetten.
Je moet juist op zoek gaan naar een property van een van de nodes die in de array zit, die je terug kreeg van ...->xpath(), waarmee je de waarde van die node aan kunt passen.
Iets als
de property textContent verzin ik nu even, omdat dat een property is van DomNode, maar zoiets moet het zijn. Een tijdje terug heb ik hier naar gezocht voor een simpleXMLELement, maar kon het niet vinden...
Wat je kunt doen is het simpleXMLElement omzetten naar een DomElement(/Node/Document (weet niet precies)) en het zo aanpassen en dan weer terug. Maar dat is natuurlijk heel omslachtig...
Je moet juist op zoek gaan naar een property van een van de nodes die in de array zit, die je terug kreeg van ...->xpath(), waarmee je de waarde van die node aan kunt passen.
Iets als
de property textContent verzin ik nu even, omdat dat een property is van DomNode, maar zoiets moet het zijn. Een tijdje terug heb ik hier naar gezocht voor een simpleXMLELement, maar kon het niet vinden...
Wat je kunt doen is het simpleXMLElement omzetten naar een DomElement(/Node/Document (weet niet precies)) en het zo aanpassen en dan weer terug. Maar dat is natuurlijk heel omslachtig...
ik heb het al, als je $item[0][0] doet werkt het!!! die laatste is dus voor de textcontent.
het heeft even geduurd, maar bedankt voor de info.
nu kan ik weer verder...
het heeft even geduurd, maar bedankt voor de info.
nu kan ik weer verder...




