Toon posts:

[PHP+XML] XHTML string in XML

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig een site om te zetten naar een Ajax achtige applicatie, maar stuit op problemen bij het maken van de xml die de server terug stuurt naar de client. De opzet is nog vrij simpel. De server ontvangt een opdracht in XML, parst de xml en voert een database query uit. De script zet de result om in een array en transformeert deze dan naar XML om terug te sturen.

Overigens gebeurt het opbouwen en parsen van de XML via de dom extensie van PHP5.

Het probleem is het opbouwen van dat laatste stuk XML. De database query geeft namelijk een (lange) xhtml string terug die voorheen zo geinclude werd in de pagina. De string is een text met paragrafen (<p></p>) en headers (<h3></h3>). Die text komt niet in het XML voor, waarschijnlijk (denk ik) omdat het geen text node betreft.

Graag zou ik weten of ik de xhtml string wel mee kan sturen en hoe! Ik kom er zelf niet uit.

De xml die ik nu krijg:
XML:
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<response>
  <content id="255_086" type="bio">
    <text/>
    <link>www.juliansas.com</link>
  </content>
</response>


En de script die het opbouwt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    // create a new XML document
    $doc = new DomDocument('1.0', 'UTF-8');
    $doc->formatOutput = true;

    // create root node
    $root = $doc->createElement('response');
    $root = $doc->appendChild($root);

foreach($result as $node => $value){
            switch($node){
                case "cat":
                    $cat = $doc->createElement($value);
                    $cat = $root->appendChild($cat);
                    break;
                case "type":
                    if(isset($cat)){
                        $cat->setAttribute('type', $value);
                    }
                    break;
                case "id":
                    if(isset($cat)){
                        $cat->setAttribute('id', $value);
                    }
                    break;
                default:
                    if(isset($cat)){
                        $$node = $doc->createElement($node);
                        $$node = $cat->appendChild($$node);
    
                        $text = $doc->createTextNode($value);
                        $text = $$node->appendChild($text);
                    }
            } 
                    
        }


En de array:
PHP:
1
2
3
4
5
6
Array ( [0] => Array ( 
[cat] => content 
[id] => 255_086 
[text] => *hier lange xtml string* 
[link] => www.juliansas.com 
[type] => bio ) )


Volgens mij is dit nog vrij knullig opgebouwd, een suggestie of (opbouwend) kritiek is altijd welkom!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

misschien moet je gebruik maken van <[[CDATA]]> om je html entities te escapen?

Raar... Is zo gek nog niet


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Je kan volgens mij twee dingen doen:

Alles in een CDATA zetten, zoals Tsjilp zegt. Wat je ook kan doen is de xhtml-namespace aan je resultaat toevoegen, en zorgen dat alle elementen in ["text"] een namespace-prefix krijgen, dus dat je bijvoorbeeld iets krijgt als:
XML:
1
2
3
<xhtml:p>
  <xhtml:h1>Hello World</xhtml:h1>
</xhtml:p>

Verwijderd

Topicstarter
Met cdata werkt het inderdaad perfect. Bedankt :)

Heeft een namespace verder nog voordelen boven cdata?

[ Voor 37% gewijzigd door Verwijderd op 20-05-2006 11:32 ]


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Als je een namespace gebruikt kan je checken of je inhoud well-formed is. Als je CDATA gebruikt gebruik je character data. Zie ook w3schools.