loathsome Skrevet 30. mars 2007 Del Skrevet 30. mars 2007 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
Stian Jacobsen Skrevet 30. mars 2007 Del Skrevet 30. mars 2007 (endret) <?php $xml->addChild('var', '<![CDATA'.$postdata.']>'); ?> eller.. <?php $xml->addChild('var', '<![CDATA'.$variabel['foo'].']>'); ?> Endret 30. mars 2007 av MrNeeon Lenke til kommentar
stiber Skrevet 30. mars 2007 Del Skrevet 30. mars 2007 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
loathsome Skrevet 31. mars 2007 Forfatter Del Skrevet 31. mars 2007 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
loathsome Skrevet 31. mars 2007 Forfatter Del Skrevet 31. mars 2007 Lurer på en ting; Hvorfor er det nødvendig med «ownerDocument», og hva gjør det? Lenke til kommentar
stiber Skrevet 31. mars 2007 Del Skrevet 31. mars 2007 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
loathsome Skrevet 31. mars 2007 Forfatter Del Skrevet 31. mars 2007 Ah, da skjønner jeg litt mer. Tusen takk, dette hjalp meg virkelig mye! Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå