2015-07-16 21 views
7

Mam plik XML z seminariami, które chciałbym podać do google-kalendarza. Plik XML jest obsługiwany przez kogoś innego i jest regularnie aktualizowany, więc chciałbym zrobić to w taki sposób, że Google automatycznie chwyta te zmiany.Feed XML do kalendarza Google

Nie mam zbyt dużego doświadczenia w tego typu sprawach, więc mam nadzieję, że ktoś wskaże mi właściwy kierunek.

To jest przykład XML, który chcę przetworzyć.

(plik 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> 

Najbardziej oczywistym sposobem osiągnięcia tego celu, powiedziałbym, jest przy użyciu arkusza stylów XSLT, który przetwarza XML i buduje jakiś plik Google -calendar może czytać. Mam stronę internetową/serwer, na którym mogę umieścić ten plik XSL, więc najlepiej byłoby mieć nadzieję, że będę mógł to zrobić za pomocą jednego przesłania właściwego pliku.

Arkusz XSL wyglądam tak.

(plik 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> 

Działa to gdybym przetworzyć pliku XML, rury go do akt iCal (xsltproc seminars.xml > mycal.ics) i zaimportować go do kalendarza w jakimś kalendarz Google. Powstały mycal.ics wygląda to

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 

Teraz problemem jest to, że (1) google nie przetwarza XML, generując błąd przy imporcie i (2) nie jestem pewien, czy ta metoda będzie automatycznie " chwyć zmiany ", ponieważ wymagałoby to od czasu do czasu przeładowania XML.

Czy istnieje sposób, aby google (lub serwer WWW) przetworzył ten plik, aby był rozpoznawany jako plik iCal, i utrzymał go na bieżąco?

Wreszcie drobnym problemem jest również to, że oryginalny plik XML zawiera inny plik XSL. Czy istnieje prosty sposób, aby zrobić coś takiego jak dowiązanie symboliczne na mojej stronie internetowej do tego pliku, lub dołączyć XML bez nagłówka, aby móc po prostu zastąpić oryginalny XSL moim?

Odpowiedz

1

Najprostszym rozwiązaniem jest prawdopodobnie utworzenie CGI na serwerze WWW, który konwertuje z xml na ical. Jeśli twoi działa serwer WWW na Linuksie to CGI może być tak proste, jak w następującym pliku (nazwałem go seminars)

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

Ten skrypt CGI jest przetwarzany przez powłoki Bourne. Jest to określone w pierwszym wierszu. Następne 2 wiersze kończą nagłówek HTTP typem (typem mime) kalendarzy ical. Ostatnia linia wykonuje konwersję przy użyciu transformacji XSLt. Zauważ, że błędy wynikające z instrukcji przetwarzania są ignorowane (przekierowywane do/dev/null).

Należy pamiętać, że serwer musi być skonfigurowany do uruchamiania CGI.Testowałem go na Apache 2 i potrzebne do

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

ja również utworzony plik .htacces$ na diretory aby upewnić się, że skrypt seminars jest przetwarzany jako CGI

<Files seminars> 
    SetHandler cgi-script 
</Files> 
Powiązane problemy