pascallantzsch
Goto Top

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:
> <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>
Bin für jegliche Hilfe dankbar face-smile

LG

Content-Key: 271062

Url: https://administrator.de/contentid/271062

Printed on: April 23, 2024 at 12:04 o'clock

Member: Clijsters
Clijsters May 04, 2015 at 18:20:05 (UTC)
Goto Top
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
Member: pascallantzsch
pascallantzsch May 04, 2015 at 18:23:58 (UTC)
Goto Top
werde gleich mal schauen wie ich code-tags einfüge und meinen beitrag dahingehend bearbeiten, danke für den hinweis face-smile
Member: pascallantzsch
pascallantzsch May 04, 2015 at 18:35:31 (UTC)
Goto Top
Im Endeffekt ist das eine XML zur Download Verification. Jedoch möchte ich das dynamischer machen, das eine Package habe ich geteilt, also das erste Package im Parent <InitialPackages>, demnach möchte ich dies mit PHP löschen und dann an dieser Stelle 12 neue Packages einfügen mit gleichem Aufbau aber unterschiedlichen Filesize, CRC, Filename und Language Attributen, die Variablen dazu hab ich in PHP schon drin.
$dom                = new DOMDocument(); 
    $dom->load($XMLPath); 
    $xml                = new DOMXPath($dom); 
    $nodes              = $xml->query("//Index/InitialPackages/");   
    $nodes->item(0);
    echo $nodes->ContentText;
    $dom->save($XMLPath);
ist mein bisheriger Versuch mit meinem Wissen zu dem Package zu kommen, was ich löschen will
Member: Clijsters
Clijsters May 04, 2015 updated at 18:55:37 (UTC)
Goto Top
Ok...
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
Member: pascallantzsch
pascallantzsch May 04, 2015 at 18:56:59 (UTC)
Goto Top
Ich sag jetzt mal Jain face-big-smile
die links hatte ich schon durchgeschaut, werde sie mir nochmals durchlesen, vielleicht kapier ich es dann :-P
Member: Clijsters
Clijsters May 04, 2015 at 19:02:35 (UTC)
Goto Top
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
Member: pascallantzsch
pascallantzsch May 04, 2015 updated at 19:25:31 (UTC)
Goto Top
Ja das hab ich schon mitbekommen ;-D

Ja naja ich schaffe es ja nicht mal DOM zum ersten Package in <InitialPackage> zu lotsen face-big-smile glaube ich brauch noch nen Hirnbooster :-P

Danke erstmal Clijsters für die Anregungen face-smile
Mitglied: 114757
Solution 114757 May 04, 2015, updated at May 27, 2015 at 09:13:41 (UTC)
Goto Top
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.
<?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)
?>
Gruß jodel32