RXML2-migrering

Från Lysators datorhandbok, den ultimata referensen.
Hoppa till: navigering, sök

Konvertera RXML1 till RXML2

Bli XML-kompatibel

Om dokumentet

Här kladdas lösningar ner på problem som tagits upp i KOM-mötet "Infosystem(@) Lysator". Det är inte avsett att vara en komplett guide utan ett ställa att teckna ner lösningar på problem som någon behövt hjälp med.

Detta dokument är författat av zino, och konverterades till wiki av ceder.

Därför vill du uppgradera

Den största skillnaden mellan Roxen 1.x och Roxen 2.x+ är att RXML också fick ändrade majorversion från RXML1 till RXML2. De stora ändringar som gjordes gör att RXML1 på många sätt är inkompatibel med RXML2. Det finns många anledningar till det, men de kan i slutändan destilleras till: Förbättrad säkerhet och XML-kompatibilitet. Det finns också ett kompatibilitetsmode, men slår man på det tappar man många av de fördelar som RXML2 ger.

Specifika Problem

RXML parse error: This tag doesn't handle content.

Exempel på RXML1 som kommer att generera det om det stoppas i en RXML2-miljö:

 <insert file=template>

I XML måste alla taggar avslutas med "/>" för att indikera att de inte är början på en container. Korrekt RXML2:


 <insert file="template" />

<insert> with replace

I RXML1 kunde man ersätta strängar i det man satte in genom att sätta in attribut med vilka namn som helst i <insert>. Det är inte så XML-vänligt, så den möjligheten finns inte längre. Den absolut vanligaste användningen är att göra sid-templates av olika slag.

Exempel i RXML1:

foo.html:

 <insert file="header" _title="Foo">
 Lorem gazonkium
 <insert file="footer" _email="zino">

header:

 <head>  <title>_title</title> </head>
 <body>

footer

   Maintainer: <a href="_email@test.com">_email@test.com</a>
 </body>

Förslag på RXML2-lösning:

foo.html (container style):

 <use file="template" />
 <my-template title="Foo" email="zino">
 Lorem gazonkium
 </my-template>


template (container style):

 <define container="my-template">
   <head>  <title>&_.title;</title> </head>
   <body>
     <contents/>
     Maintainer: <a href="&_.email;@test.com">&_.email;@test.com</a>
   </body>
 </define>

<insert>-attributet name fungerar inte

Det är korrekt uppfattat. Använd variabler.

RXML1:

 <define name=foo>Hej</define>
 <insert name=foo>

RXML2:

 <set variable=var.foo>Hej</set>
 &var.foo;

Tagar, containers och attribut som skrivs med stora bokstäver fungerar inte

XML har lyckligtvis tightat upp det. Skriv allt med små bokstäver så fungerar det.

RXML1:

 <MODIFIED>

RXML2:

 <modified/>

<modified lang="se" /> ger inte svensk text

Koden "se" är upptagen av ett annat språk och svenska måste anges med standardkoden sv.

RXML1:

 <modified lang="se">

RXML2:

 <modified lang="sv"/>

Sidan blir inte RXML-parsad alls

För att din sida ska RXML-parsas så måste filen ha execute-bitten satt. Dvs, du måste göra operationen chmod +x filnamn.html. Detta är ett val som gjorts av Lysators webansvarige i den nya servern för att låta användaren ha större kontroll över hur resultat retuneras från servern.

(Det här är inte ett RXML2-specifikt problem, utan en skillnad i inställning av servrarna på Lysator.)

Tips och trick

Under den här rubriken samlar vi tips från våra medlemmar om hur man kan underlätta migreringen.

Konvertera <insert>-taggar

Fabian Norlin tipsar om att man kan konvertera <insert>-taggar så att de följer XML samt RXML2 med detta lilla behändiga perl-script:

perl -pi -e 's/<insert file="([^>]*)>/<insert file="$1\/>/g' *.html

Tänk på att det här gör ändringar i filerna! Spara gärna en kopia först, om något skulle gå fel. Tipset kan lätt modifieras för att fixa till andra taggar.

(En dårsateprodukt)