Gå til innhold

Vil ikke ha HTML-entities i XML-filer


Anbefalte innlegg

Har laget et script som tar input fra et skjema og lagrer det til en XML-fil. All HTML er i ISO-8859-1, det samme er XML-filene. DOM bruker UTF-8 internt for XML. Problemet er at alle HTML-tegn blir til HTML-entities i XML-filen når jeg lagrer.

 

Altså:

 

<a

href="http://www.studvest.no/">Studvest</a><br/>

 

Og ikke:

 

<a href="http://www.studvest.no/">Studvest</a><br/>

 

Dette er altså dataene som er lagret i en node med navn "options". XML-tagene er OK, altså med <, > og / i orden.

 

Her er koden, har forsøkt å kommentere så mye som mulig.

 

// Last inn XML-en fra en streng lagret i $_SESSION
// XML-en er OK etter dette
$xml = DOMDocument::loadXML($_SESSION["Template"][$_SESSION["ActiveTemplate"]]);
$xml->formatOutput = true;

// Denne er kanskje litt vanskelig å skjønne...
// Men basically, den endrer innholdet i <options></options> til noe nytt. Det er funksjonen ModuleUpdateElement() som returnerer en tekststreng, som blir konvertert fra ISO-8859-1 til UTF-8, da XML er UTF-8 internt. Uten mb_convert_encoding() får jeg feilmeldinger når det er æøå eller lignende i koden.
// XML-en er OK også etter denne neste linjen
$xml->getElementsByTagName($_POST["Position"])->item(0)->getElementsByTagName("module")->item($_POST["XMLID"])->getElementsByTagName("options")->item(0)->nodeValue = mb_convert_encoding(ModuleUpdateElement(), "UTF-8", "ISO-8859-1");
// Lagre den nye XMLen tilbake til $_SESSION. Etter dette er innholdet i <options> som nevnt over, altså med html-entities i stedet for < > / og så videre.
$_SESSION["Template"][$_SESSION["ActiveTemplate"]] = $xml->saveXML();

 

Det finnes jo funksjoner for å decode HTML-entities til vanlige tegn, men det virker litt tungvint. Noen forslag?

 

Her er et utdrag av XML-filen:

 

<?xml version="1.0" encoding="iso-8859-1"?>
<body>
 <header>
 </header>
 <meta>
 </meta>
 <title>
   <module active="1">
     <id>3</id>
     <options>Tittel</options>
   </module>
 </title>
</body>

 

MVH Audun

Lenke til kommentar
Videoannonse
Annonse

Med SimpleXML kan man bruke $Node->asXML() og få ut hele noden, dvs med <options></options> rundt innholdet, uten at den bryr seg om hva som er inni. Så er det bare å bruke en regex eller lignende for å fjerne det som er rundt og få ut innholdet.

 

Hvis jeg lager XML-filene manuelt, og lagrer slik jeg vil det skal lagres, er det ikke noe problem med ovennevnte metode. Slik det er nå kan jeg selvfølgelig hente ut HTML-en slik den er, med HTML-entities, og oversette til rett kode, men XMLen blir veldig vanskelig å lese (for vanlige mennesker) når HTMLen er full av entities.

 

Bruker DOM for å redigere XMLen, SimpleXML der det er hensiktsmessig for å hente ut innhold.

 

MVH Audun

Endret av audunr
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...