Gå til innhold

CDATA og XML-lagring.


Anbefalte innlegg

Hei,

 

Når jeg legger til et child vha. addChild, så vil jeg gjerne legge innholdet rundt CDATA-tagger. Hvordan kan jeg gjøre dette? Tenker på noe slikt;

<?php
$xml->addChild('var', '<![CDATA['.$postdata.']]>');
?>

 

Overstående kode for å illustrere mitt poeng. Det som skjer dersom jeg "executer" den, er at all CDATA-koden blir replace til "htmlspecialchars", dvs. >![CDATA[ osv. - altså, CDATA har ingen effekt.

 

Hvordan skal jeg løse dette? Takk for svar!

 

Her har vi en med samme problem;

http://www.codeguru.com/forum/showthread.php?t=349540

Lenke til kommentar
Videoannonse
Annonse

simpleXML egner seg ikke så godt til å generere mer "avansert" XML. Da tenker jeg på bruk av namespaces, skjema, dtd, stylesheets, cdata seksjoner ol.

 

Du kan komme rundt dette med å jobbe på det underliggende DOM objektet som ligger i simpleXML med å kalle dom_import_simplexml(). Endringer du gjør i dom vil automagisk være tilgjengelig i simple også :)

 

<?php
$simple = simplexml_load_string('<root><test/></root>');
$domNode = dom_import_simplexml($simple->test);
$cdata = $domNode->ownerDocument->createCDATASection('<em>test</em>');
$domNode->appendChild($cdata);
echo $simple->asXML();

/*
<?xml version="1.0"?>
<root><test><![CDATA[<em>test</em>]]></test></root>
*/
?>

Lenke til kommentar

Konge, stiber! Akkurat det jeg trengte.

 

Jeg løste i midlertidig problemet slik;

PHP

<?php

function sxml_cdata($string){

$in = array('<![CDATA['']]>');

$out = array('<![CDATA['']]>');

$string str_replace($in$out$string);

return $string;

}

?>

 

Er dette en god løsning? Vil HELST holde meg innenfor SXML, men om jeg må bevege meg over på DOM så gjør ikke det noen ting! ;)

Lenke til kommentar

Det der er nok ingen ideel løsning, men virker nok.

 

Jeg ville kanskje gått for noe slik:

 

<?php
class mySXML extends simpleXMLElement {

 public function addCdata($cdata) {
   $domNode = dom_import_simplexml($this);
   $cdata = $domNode->ownerDocument->createCDATASection($cdata);
   $domNode->appendChild($cdata);
 }
}

$sxml = simplexml_load_string('<root><test/></root>','mySXML');
$sxml->test->addCdata('<em>test</em>');
echo $sxml->asXML();

 

Det er litt problematisk å utvide simpleXML, fordi det ikke er mulig å ha propreties i klassen, uten at de havner i xml fila. Jeg synes godt at man burde fått lov til å ha private/protected properties, uten at de havner i fila. Det ville f.eks vært kjekt å hatt dom tilgjengelig, uten å måtte kjøre dom_import_simplexml for hver metode man hadde. En annen uting de har gjort, er å deklarere __constructor til final slik at du ikke kan overstyre den i en egen klasse :(

 

Angående ownerDocument...

Når du kjører dom_import_simplexml() får du returnert et DOMElement og ikke selveste DOMDocument. ownerDocument gir deg tilgang til DOMElementets DOMDocument. createCDATASection er en metode i DOMDocument. Du ville fått en feilmelding liknende "Call to undefined method DOMElement::createCDATASection()" uten ownerDocument... Svimmel nå? :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...