PHP <![CDATA[]]> Werte in XML bearbeiten?

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.721
Moin zusammen,

ich doch noch mal. Und zwar möchte ich noch in meinen XML Files Werte bearbeiten, welche in einem <![CDATA[]]> Format stehen. Ich habe bereits mitbekommen, dass ich diese Werte nicht berühren sollte, da die irgendwelche Daten beinhalten die escaped sind. Allerdings müsste ich an die Values in den <![CDATA[]]> Format noch etwas an den Link hängen. In Zeile 8 zum Beispiel der Fall!

Weiß jemand wie und ob das überhaupt möglich ist?
Ich möchte natürlich auch nicht den Link zerstören. Was passiert den, wenn ich einfach das <![CDATA[]]> entferne?

XML Beispiel:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<rss>
  <channel xmlns:g="http://base.google.com/ns/1.0" version="2.0">
    <title>Google Eur English 1</title>
    <link><![CDATA[http://cdn.kinguin.net/media/feedexport/google_EUR_english_1.xml]]></link>
    <item>
      <title>Anno 2070</title>
      <link><![CDATA[http://www.kinguin.net/category/4/anno-2070/?nosalesbooster=1&country_store=1&currency=EUR]]></link>
      <g:price><![CDATA[3.27 EUR]]></g:price>
      <g:image_link><![CDATA[http://cdn.kinguin.net/media/catalog/category/anno_8.jpg]]></g:image_link>
    </item>

MfG und Vielen Dank
 
Alles klar, Vielen Dank!

Ich schaue mir das mal an!
Ergänzung ()

Ich habe es nun soweit hinbekommen, dass ich die Daten aus dem XML CDATA lade. Wie kann ich jetzt aber sagen, dass ich jetzt etwas in CDATA einfügen möchte?

Ich nutzte DomDocument und unter dem Link von dir steht nur appendChild. Ich will ja aber den Wert den ich vorher ausgelesen habe modifizieren und in den selben Tag laden. Also ersetzten!

Mein bisheriger Code:
Code:
    $dom = new DOMDocument('1.0', 'utf-8');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->load($path);

    $titles = $dom->getElementsbyTagName($linkTag);
    foreach($titles as $title){
        foreach($title->childNodes as $child){
            echo $child->textContent . "\n";
        }
    }
 
Aber da steht doch auch appendChild()... ?
Ich will das doch nur ersetzten?
 
Ich denke du kannst den nodeValue direkt setzen. Das würde ich mal als erstes versuchen und debuggen. Je nachdem wie das bei CDATA ist, kann es aber auch sein, dass du erst eine neue Node erzeugen, die einsetzen und die alte löschen musst.
 
Also ich probiere es, aber es funktioniert nicht!

Code:
    $dom = new DOMDocument('1.0', 'utf-8');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->load($path);
    
    $dom->getElementsbyTagName($linkTag)->item(0)->nodeValue = "Test";

XML:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<rss>
  <channel xmlns:g="http://base.google.com/ns/1.0" version="2.0">
    <title><![CDATA[google_EUR_english_1]]></title>
    <link><![CDATA[http://cdn.kinguin.net/media/feedexport/google_EUR_english_1.xml]]></link>
    <item>
      <title><![CDATA[Anno 2070 Uplay CD Key]]></title>
      <link><![CDATA[http://www.kinguin.net/category/4/anno-2070/?nosalesbooster=1&country_store=1&currency=EUR]]></link>
      <g:price><![CDATA[3.17 EUR]]></g:price>
      <g:image_link><![CDATA[http://cdn.kinguin.net/media/catalog/category/anno_8.jpg]]></g:image_link>
    </item>
Ergänzung ()

Habe meinen Fehler!

Vergessen:
Code:
    $dom->saveXML();
    $dom->save($path);

Allerdings sind die jetzt nicht mehr im CDATA Format?
Code:
<?xml version="1.0" encoding="UTF-8"?>
<rss>
  <channel xmlns:g="http://base.google.com/ns/1.0" version="2.0">
    <title><![CDATA[google_EUR_english_1]]></title>
    <link><![CDATA[http://cdn.kinguin.net/media/feedexport/google_EUR_english_1.xml?r=30255]]></link>
    <item>
      <title><![CDATA[Anno 2070 Uplay CD Key]]></title>
      <link>TEST?r=30255</link>
      <g:price><![CDATA[3.17 EUR]]></g:price>
      <g:image_link><![CDATA[http://cdn.kinguin.net/media/catalog/category/anno_8.jpg]]></g:image_link>
    </item>
 
Hier tritt wohl das Problem auf, dass du CDATA nicht als Value einfach setzen kannst. In diesem Fall musst du (Quelle):
PHP:
<?php
$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
$node->removeChild($node->firstChild);
$newText = $doc->createCDATASection('new cdata content');
$node->appendChild($newText);
echo "Content withCDATA: ".$doc->saveXML($node)."\n";
?>
 
Also ich werde aus dem CDATA wirklich nicht schlau... Wer gestaltet das so kompliziert.

Das hier ist jetzt mein Code. Der funktioniert aber nur, wenn ich die Datei als neue Datei abspeicher. Wenn ich die alte Datei damit überschreiben will, dann macht der das leider nicht...:
Code:
$dom = new DOMDocument('1.0', 'utf-8');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = true;
    $dom->load('data/kinguin.xml');


    $titles = $dom->getElementsbyTagName($linkTag);
    foreach($titles as $title){
        foreach($title->childNodes as $child){
            $node =  $child->textContent;
            $node = $node . "?r=302";
            $child->nodeValue = $node;
        }
    }

    $titles = $dom->getElementsbyTagName($priceTag);
    foreach($titles as $title){
        foreach($title->childNodes as $child){
            $node =  $child->textContent;
            $node = preg_replace('/\b EUR\b/iu', '', $node);
            $child->nodeValue = $node;
        }
    }

    $dom->saveXML();
    $dom->save('data/kinguin2.xml'); //NEUE DATEI!

Wie kann ich denn das machen, dass ich sage, ersetzte die alte Datei. Also irgendwie removeChild() und appendChild(). Ich bekomme es leider nicht hin. Kann mir da einer mal helfen?

Vielen Dank!
 
Das Abspeichern hängt wahrscheinlich nicht mit XML sondern den Dateizugriffsrechten zusammen.

Folgender Befehl geht wahrscheinlich auch nicht, oder?
PHP:
file_put_contents("data/kinguin.xml", "Test");

Wenn du die Datei kinguin.xml per FTP hochlädst, musst du schauen, dass sie der gleichen Unix-User-Gruppe bzw. User angehört, wie der Webserver/PHP-Prozess. Falls die die kinguin.xml öfters hochlädst, kann es auch reichen, dem Verzeichnis die passenden Rechte zu geben. Musst du ausprobieren, hängt immer bisl vom Webserver ab.

Wenn du die kinguin.xml via PHP erstellst, sollte das Problem nicht auftreten.
 
Zurück
Oben