PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   xml elemente verschieben (http://www.selfphp.de/forum/showthread.php?t=23210)

moodsx 03.05.2010 12:13:21

xml elemente verschieben
 
Hallo Community,

ich beschäftige mich derzeit mit php5 und xml, genauer gesagt simplexml.

Soweit habe ich die Sache auch am Start und scheine jetzt an die Grenzen von simplexml zu kommen deshalb hier meine Frage. Folgendes xml Beispiel will ich bearbeiten:

Code:

<channel>
<a name="a">
<a1 name="a1">InhaltA1</a1>
<a2 name="a2">InhaltA2</a2>
<a3 name="a3">InhaltA3</a3>
</a>
<b name="b">Inhalt B</b>
</channel>

Hier möchte ich jetzt folgendes durchführen:
"a3" soll verschoben werden vor "a1", es sollte aber so sein das wenn Kinder in "a3" vorhanden sind diese auch mit übernommen werden. Die Attribute sollten ebenfalls erhalten bleiben. Lässt sich das ganze irgendwie mit simplexml erschlagen oder muss ich mich doch wirklich mit DOM beschäftigen? Leider ist DOM für mein Gehirn nicht wirklich geeignet, wäre gut wenn man das auch anders, leichter erschlagen könnte.

Danke für Eure Hilfe.

urvater 04.05.2010 15:34:49

AW: xml elemente verschieben
 
Wenn du hier keine umgekehrte Sortierung haben willst macht es eigentlich keinen Sinn oder besser sehe ich keinen Sinn den Knoten an eine andere Stelle zu setzen.
Oder möchtest/musst du die Ausgabe der Daten per Styles erledigen?

Lt. deinem Beispiel ist innerhalb von "a" nur "a1" "a2" und "a3" als Knoten bzw. Element erlaubt. Da sie direkt angesprochen werden können ist ihre Position eigentlich vollkommen irrelevant sofern man die Ausgabe nicht über Styles machen möchte/muss.

Dein Vorhaben ist mit Funktionen von simpleXML und, wenn ich nichts übersehen habe, auch mit DOM so nicht machbar.

Eine Möglichkeit wäre die Knoten deiner XML Datei in eine neue tempoäre XML Datei oder neu in die vorhandene Datei so zu schreiben, wie du sie gern haben möchtest.

moodsx 04.05.2010 15:50:48

AW: xml elemente verschieben
 
Es kann natürlich gut sein das ich zu kompliziert denke bzw. xml für mein Vorhaben nicht wirklich geeignet ist. Ich will versuchen das kurz darzulegen:

Ich arbeite meine Webseite um will keine Datenbank im herkommlichen Sinne benutzen, warum das lassen wir mal aussen vor. Deswegen kam mir der Gedanke nimm doch einfach xml, für sowas ist es doch geschaffen worden, oder? Soweit so gut, das bedeutet das die Navigation + Inhalte allein aus dieser xml stammen. In unserem Beispiel wäre "a" die Überschift bzw. Kategorie und "a1, a2..." der Content. Jetzt will man natürlich die Links bzw. Kategorien speziell wenn was neues hinzukommt nicht am Ende haben sondern das ganze sortieren, genau dafür müsste auch die xml Datei umsortiert werden.

Mein Gedanke war jetzt eventuell den Knoten zu lösen und per "DOMDomument::importNode" an die gewünschte Stelle zu importieren, aber im Moment scheitere ich daran.

urvater 04.05.2010 16:35:35

AW: xml elemente verschieben
 
Vorab erst einmal: XML dient für den Datentransport zwischen Anwendungen. Sicherlich kann man es auch als DB Erstaz nutzen.

Da ich nun weiß wo das Problem liegt kannst du sowas per DOM umsetzen.
Zum Einfügen würde sich da DOMNode::insertBefore anbieten. Zuvor müsstest du natürlich die Stelle ermitteln an der der neue Knoten erstellt werden muß.

Ich bin mir allerdings nicht sicher ob deine XML Struktur hier richtig gewählt ist, wenn du damit ganze Wegseiten erstellen willst. Insbesondere der Einsatz von Attributen scheint mir nicht klar und sinnvoll zu erscheinen. Kann aber auch sein, daß es nur an dem vereinfachten Beispiel liegt.

Neuer Content könnte ruhig am Ende stehen. Hier könnte man die Knoten in umgekehrter Reihenfolge ausgeben lassen.
Bei einem neuen Menüeintrag sollte diese schon an der korrekten Stelle stehen, wenn das Menü nicht sinnvoll sortiert werden kann. Nach dem Alphabet sortieren z. B.

Zitat:

Mein Gedanke war jetzt eventuell den Knoten zu lösen und per "DOMDomument::importNode" an die gewünschte Stelle zu importieren, aber im Moment scheitere ich daran.
Wo liegt das Problem? Gibt es Fehler? Wie sieht dein Versuch aus?

moodsx 04.05.2010 23:00:13

AW: xml elemente verschieben
 
Also was die Attribute betrifft so muss ich Dir sagen das sich das für mich als notwendig erachte und die bereits auch nutze wie z.B.

Code:

<Impressum name="Impressum" link="/Infos/Impressum" status="content" visible="yes">...</Impressum>
Ich muss ja wiessen was das System da an der Stelle ausgeben soll, content oder einfach eine category, soll es sichtbar sein und so weiter.
Ich werte die Attribute bereits aus und das funktioniert einwandfrei.

Was nun meinen Versuch betrifft so sei nachsichtig mit mir, ich fang eben erst an mit DOM:

xm (test.xml):

Code:

<?xml version="1.0" encoding="utf-8"?>
<root name="root">Der Anfang
<channel name="channel">Der Channel
<Inhalt1 name="Inhalt1">Der 1.Inhalt</Inhalt1>
</channel>
</root>

php:

Code:

$newdoc = new DOMDocument;
$newdoc->loadXML('<Test name="Test">Der Test
<Test2 name="Test2">Der 2. Test</Test2></Test>');

$doc = new DOMDocument();
$doc->load('test.xml');
$element = $doc->getElementsByTagName('Inhalt1')->item(0);
$node = $element->importNode($newdoc, True);
$doc->save('test.xml');

Das schlägt natürlich fehl mit dem folgenden Fehler:

Fatal error: Call to undefined method DOMElement::importNode()

was ich bis jetzt leider noch nicht begriffen hab. Eventuell kannst Dur mir da einen Tip geben, wäre nett.


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:06:55 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.