PHP XML DOM Xpath - Child Node löschen und durch 12 idntische Ersetzen
Hallo, ich mal wieder mit einem PHP/XML Problem,
ich hab versucht es mit SImpleXML zu lösen, allerdings schreibt er mir dann alles in eine Zeile.
Leider kenne ich mich noch nicht so gut it DOMXML bzw. XPath aus
OK das eigentliche Problem:
BeispielCode:
Ich möchte dann bei <InitialPackages> das erste Child Node löschen und stattdessen 12 mal eigentlich das selbe einsetzen (UNterschiede sind dann nur bei Filesize, CRC, FileName und Language)
Es sollte dann also so aussehen:
Bin für jegliche Hilfe dankbar
LG
ich hab versucht es mit SImpleXML zu lösen, allerdings schreibt er mir dann alles in eine Zeile.
Leider kenne ich mich noch nicht so gut it DOMXML bzw. XPath aus
OK das eigentliche Problem:
BeispielCode:
> <Index>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="11" />
> <IndexFileCRC val="1122" />
> <IndexFileSig val="1234" />
> <Version val="1" />
> <FileName val="Ordner1:Datei1.zip" />
> <Language val="all" />
> </Package>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="ipad" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="11" />
> <IndexFileCRC val="1122" />
> <IndexFileSig val="1234" />
> <Version val="1" />
> <FileName val="Ordner2:Datei2.zip" />
> <Language val="all" />
> </Package>
> <InitialPackages>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="11" />
> <IndexFileCRC val="1122" />
> <IndexFileSig val="1234" />
> <Version val="1" />
> <FileName val="Ordner1:Datei3.zip" />
> <Language val="all" />
> </Package>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="11" />
> <IndexFileCRC val="1122" />
> <IndexFileSig val="1234" />
> <Version val="1" />
> <FileName val="Ordner3:Datei4.zip" />
> <Language val="all" />
> </Package>
> </InitialPackages>
> </Index>
Ich möchte dann bei <InitialPackages> das erste Child Node löschen und stattdessen 12 mal eigentlich das selbe einsetzen (UNterschiede sind dann nur bei Filesize, CRC, FileName und Language)
Es sollte dann also so aussehen:
> <InitialPackages>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="88" />
> <IndexFileCRC val="9999" />
> <IndexFileSig val="0000" />
> <Version val="1" />
> <FileName val="OrdnerNEU:Datei1NEU.zip" />
> <Language val="all" />
> </Package>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="88" />
> <IndexFileCRC val="9999" />
> <IndexFileSig val="0000" />
> <Version val="1" />
> <FileName val="OrdnerNEU:Datei2NEU.zip" />
> <Language val="all" />
> </Package>
> [...]
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="88" />
> <IndexFileCRC val="9999" />
> <IndexFileSig val="0000" />
> <Version val="1" />
> <FileName val="OrdnerNEU:Datei12NEU.zip" />
> <Language val="all" />
> </Package>
> <Package platform="all" unzip="false" minVersion="1.01.0" tier="all" xml="" type="" ignore="false">
> <LocalDir name="folder" />
> <FileSize val="11" />
> <IndexFileCRC val="1122" />
> <IndexFileSig val="1234" />
> <Version val="1" />
> <FileName val="Ordner3:Datei4.zip" />
> <Language val="all" />
> </Package>
> </InitialPackages>
LG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 271062
Url: https://administrator.de/contentid/271062
Ausgedruckt am: 24.11.2024 um 21:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo,
bitte nimm es mir nicht übel, aber Du hast nicht definitiv ausgesagt, was du womit machst.
Du hast aktuell mit PHP & XPath vor, diese XMLs zu bearbeiten?
Die Zitatebene macht es nicht gerade sonderlich leserlich. code-Tags sind das Zauberwort.
Wie sieht dein aktueller Code aus? Was soll er im allgemeinen tun?
Beste Grüße
Dominique
bitte nimm es mir nicht übel, aber Du hast nicht definitiv ausgesagt, was du womit machst.
Du hast aktuell mit PHP & XPath vor, diese XMLs zu bearbeiten?
Die Zitatebene macht es nicht gerade sonderlich leserlich. code-Tags sind das Zauberwort.
Wie sieht dein aktueller Code aus? Was soll er im allgemeinen tun?
Beste Grüße
Dominique
Ok...
Schau vielleicht mal in die Richtung:
Sind das Anregungen in die richtige Richtung?
Beste Grüße
Dominique
P.S.: Achja und was sagte Google? Genau: PHP Manual
Schau vielleicht mal in die Richtung:
$nodes->item(0); //hä?!
echo $nodes->ContentText; //hmm...
//Vielleicht meintest du ja:
echo $nodes->item(0)->ContentText;
//es gibt auch noch sowas wie:
$node->childNodes;
Sind das Anregungen in die richtige Richtung?
Beste Grüße
Dominique
P.S.: Achja und was sagte Google? Genau: PHP Manual
Dort sind deine Fragen nicht zu 100% beantwortet, aber wenn du es aufmerksam durchgehst, solltest du mit deinem aktuellen code ein gutes Stück weiter kommen.
Selektieren, entfernen und Einfügen von Nodes ist darin (verstreut) enthalten.
Denk auch daran, dir die Kommentare der PHP Manual Kapitel anzusehen. Die sagen manchmal mehr, als der ganze Rest.
LG
Selektieren, entfernen und Einfügen von Nodes ist darin (verstreut) enthalten.
Denk auch daran, dir die Kommentare der PHP Manual Kapitel anzusehen. Die sagen manchmal mehr, als der ganze Rest.
LG
Moin,
warum das erste Package löschen, das kann ja als Template dienen was man mit cloneNode dupliziert und man dann nur noch die Daten abändern muss ... ungefähr so:
Die For-Schleife kann man ja dann z.B. durch eine ersetzen die über Datenbank-Einträge oder ein Array mit den benötigten Daten iteriert und dann an den entsprechenden Stellen die Variablen einsetzt.
Gruß jodel32
warum das erste Package löschen, das kann ja als Template dienen was man mit cloneNode dupliziert und man dann nur noch die Daten abändern muss ... ungefähr so:
Die For-Schleife kann man ja dann z.B. durch eine ersetzen die über Datenbank-Einträge oder ein Array mit den benötigten Daten iteriert und dann an den entsprechenden Stellen die Variablen einsetzt.
<?php
$XMLPath = "test.xml";
$dom = new DOMDocument();
$dom->load($XMLPath);
$xml = new DOMXPath($dom);
// erstes Child Package selektieren
$child = $xml->query("//Index/InitialPackages/Package[1]")->item(0);
// Mutterelement speichern
$parent = $child->parentNode;
// 12 identische Nodes mit eigenen Attributen erzeugen
for($i=1;$i<=12;$i++){
//neue Kopie erzeugen
$templateNode = $child->cloneNode(true);
// hier Änderungen an der Kopie des ersten Nodes vornehmen (Attribute etc.)
$xml->query("LocalDir",$templateNode)->item(0)->setAttribute("name","testfolder");
$xml->query("FileSize",$templateNode)->item(0)->setAttribute("val","22");
$xml->query("IndexFileCRC",$templateNode)->item(0)->setAttribute("val","2222");
$xml->query("IndexFileSig",$templateNode)->item(0)->setAttribute("val","3333");
$xml->query("Version",$templateNode)->item(0)->setAttribute("val","2");
$xml->query("FileName",$templateNode)->item(0)->setAttribute("val","testfilename.txt");
$xml->query("Language",$templateNode)->item(0)->setAttribute("val","de");
// welche dann im folgenden Schritt im DOM wieder eingefügt wird
$parent->insertBefore($templateNode,$child);
}
// ursprünglichen ersten Knoten löschen
$parent->removeChild($child);
//speichern
$dom->save($XMLPath)
?>