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-ID: 271062

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

Ausgedruckt am: 24.11.2024 um 21:11 Uhr

Clijsters
Clijsters 04.05.2015 um 20:20:05 Uhr
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
pascallantzsch
pascallantzsch 04.05.2015 um 20:23:58 Uhr
Goto Top
werde gleich mal schauen wie ich code-tags einfüge und meinen beitrag dahingehend bearbeiten, danke für den hinweis face-smile
pascallantzsch
pascallantzsch 04.05.2015 um 20:35:31 Uhr
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
Clijsters
Clijsters 04.05.2015 aktualisiert um 20:55:37 Uhr
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
pascallantzsch
pascallantzsch 04.05.2015 um 20:56:59 Uhr
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
Clijsters
Clijsters 04.05.2015 um 21:02:35 Uhr
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
pascallantzsch
pascallantzsch 04.05.2015 aktualisiert um 21:25:31 Uhr
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
114757
Lösung 114757 05.05.2015, aktualisiert am 27.05.2015 um 11:13:41 Uhr
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