2015-07-16 28 views
7

Ho un file XML con seminari che vorrei alimentare per google-calendar. Il file XML è gestito da qualcun altro e viene aggiornato regolarmente, quindi mi piacerebbe farlo in un modo che google acquisisce automaticamente queste modifiche.Feed XML a Google Calendar

Non ho molta esperienza con questo genere di cose quindi spero che qualcuno possa indicarmi la giusta direzione.

Questo è un esempio dell'XML che desidero elaborare.

(file XML: "seminars.xml")

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="ical.xsl"?> 

<seminars> 
    <lastupdate>20150707</lastupdate> 

    <seminar> 
    <speaker>A. Einstein</speaker> 
    <location>Zurich</location> 
    <date>20150607</date> 
    <time>15:45:00</time> 
    <university>Princeton</university> 
    <abstract> 
     <title>On the structure of generalized patent office spaces</title> 
     <content>To be announced.</content> 
    </abstract> 
    </seminar> 

</seminars> 

Il modo più ovvio per raggiungere questo obiettivo, direi, sta utilizzando un foglio di stile XSLT che elabora i dati XML e costruisce alcuni file di Google -Calendario può leggere. Ho un sito web/server in cui posso inserire questo file XSL in modo ideale, spero di poterlo fare con un solo upload del file giusto.

Il foglio XSL che ho assomiglia a questo.

(file XSL: "ical.xsl")

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="iso-8859-1" media-type="text/calendar"/> 
<xsl:variable name="crlf">&#13;&#10;</xsl:variable> 
<xsl:template match="/">BEGIN:VCALENDAR<xsl:value-of select="$crlf"/> 
CALSCALE:GREGORIAN<xsl:value-of select="$crlf"/> 
VERSION:2.0<xsl:value-of select="$crlf"/> 
SEQUENCE:1<xsl:value-of select="$crlf"/> 
X-WR-TIMEZONE:Europe/Paris<xsl:for-each select="seminars/seminar"><xsl:value-of select="$crlf"/> 
BEGIN:VEVENT<xsl:value-of select="$crlf"/> 
LOCATION:<xsl:value-of select="location"/><xsl:value-of select="$crlf"/> 
DTSTART:<xsl:value-of select="date"/>T154500<xsl:value-of select="$crlf"/> 
DTEND:<xsl:value-of select="date"/>T164500<xsl:value-of select="$crlf"/> 
DESCRIPTION:seminar by <xsl:value-of select="speaker"/><xsl:value-of select="$crlf"/> 
SUMMARY:<xsl:value-of select="abstract/title"/><xsl:value-of select="$crlf"/> 
END:VEVENT<xsl:value-of select="$crlf"/></xsl:for-each> 
END:VCALENDAR<xsl:value-of select="$crlf"/> 
</xsl:template> 
</xsl:stylesheet> 

Questo funziona se elaborare il file XML, pipe a un iCal file (xsltproc seminars.xml > mycal.ics), e importarlo in qualche calendario google-calendario. La risultante mycal.ics assomiglia a questo

BEGIN:VCALENDAR 
CALSCALE:GREGORIAN 
VERSION:2.0 
SEQUENCE:1 
X-WR-TIMEZONE:Europe/Paris 
BEGIN:VEVENT 
LOCATION:Zurich 
DTSTART:20150607T154500 
DTEND:20150607T164500 
DESCRIPTION:seminar by A. Einstein 
SUMMARY:On the structure of generalized patent office spaces 
END:VEVENT 

Ora, il problema è che (1) google non elabora l'XML, generando così un errore su l'importazione e (2) Io non sono sicuro se questo metodo potrebbe automaticamente " afferra le modifiche "poiché richiederebbe di ricaricare l'XML occasionalmente.

Quindi, c'è un modo per rendere google (o il server web) elaborare questo file in modo che sia riconosciuto come un file iCal, e mantenuto aggiornato?

Infine, un problema minore è anche che l'XML originale ha un file XSL diverso all'interno. C'è un modo semplice per creare qualcosa come un link simbolico sul mio sito web in questo file, o includere l'XML senza l'intestazione in modo che io possa semplicemente sostituire l'XSL originale con il mio?

risposta

1

La soluzione più semplice è probabilmente quella di creare un CGI sul server Web che converte da xml a ical. Se sul web server su Linux allora il CGI possono essere così semplice come il seguente file (ho chiamato seminars)

#!/usr/bin/sh 
echo Content-type: text/calendar 
echo 
/usr/bin/xsltproc ical.xsl seminars.xml 2> /dev/null 

Questo script CGI viene elaborato dalla shell Bourne. Questo è specificato dalla prima riga. Le seguenti 2 righe finalizzano l'intestazione HTTP con il tipo di supporto (tipo mime) dei calendari ical. L'ultima riga esegue la conversione utilizzando la trasformazione XSLt. Si noti che gli errori dovuti all'istruzione di elaborazione vengono ignorati (reindirizzati a/dev/null).

Si noti che il server deve essere configurato per eseguire CGI.L'ho testato su Apache 2 e aveva bisogno di

chmod 755 seminars   # make CGI file executable 
chmod . 711     # close directory to others (suexec) 

Ho anche creato un file .htacces$ sul diretory per assicurarsi che lo script seminars viene elaborato come CGI

<Files seminars> 
    SetHandler cgi-script 
</Files>