Till senaste kommentaren

XSD Schema för resultatet av ett anrop till ResRobot Reseplanerare

Kan ni förbättra dokumentationen om XSD schemat?
Exakt vilken URL ska man använda för att erhålla schemat?
Detta är allt som jag f.n. kan hitta om XSD schemat för ResRobot Reseplanerare:
"
Xsd-tjänst
Xsd-tjänsten kan användas för att hämta ut en xsd-beskrivning av Sök Resa. Xsd beskrivningen innehåller fält (markerade optional) som inte används idag, men som inkluderas i framtiden då data lir tillgängligt.
"
https://www.trafiklab.se/api/resrobot-reseplanerare/sok-resa

Kommentarer

  • Hej Thomas!

    Det verkar som det försvann en länk där. Här har du XSD länken, jag fixar dokumentationssidan direkt. Vi håller på att göra om vår dokumentation, så den blir bättre i framtiden.

    För att bättre förstå våra användare och hur vi kan förbättra: Varför använder du XSD schema:n? För att generera kod, för att validera svar, .... ?

    Hälsningar,
    Bert
    Bert på Trafiklab
  • Hej,

    Jag vill använda XML Schema för att slippa skriva så mycket egen kod för att parsa XML eller Json.
    Det verkar f.ö. finnas någon slags motsvarighet för json men jag har inte använt den någon gång och statusen verkar vara "draft"
    ( https://json-schema.org/ )

    Jag har dock inte hittat något som tyder på att ni har publicerat ett json schema så därför använder jag XML schema istället.
    XML schema och JSON verkar f.ö. gå att kombinera på så sätt att man kan generera Java-klasser med XML schemat, och sedan kan de genererade klasserna användas vid json parsningen.
    Observera alltså att jag använder Java (men det kanske finns liknande möjligheter för andra programmeringsspråk).

    Jag blev dock tvungen att redigera lite i XSD schemat pga "xs:duration" problemet som jag f.ö. har nämnt tidigare avseende SL's API i min kommentar från 7 januari 2020:
    https://support.trafiklab.se/org/trafiklabse/d/reseplanerare-3-hur-ska-duration-vardet-tolkas/

    Så här kan man göra med Java för enkelt parsa json m.h.a. klasser som man genererar från XML schema inklusive hur man kommer runt problemet angående xs:duration :
    Ladda ned båda dessa filer till samma katalog:
    https://api.resrobot.se/xsd?hafasRestTrip.xsd
    https://api.resrobot.se/xsd?hafasRestPolyline.xsd
    (den förstnämnda refererar till den andra , dvs "hafasRestTrip.xsd" innehåller raden <xs:include schemaLocation="hafasRestPolyline.xsd"/> )
    Redigera "hafasRestTrip.xsd" på följande sätt:
    Ersätt alla förekomster av "xs:duration" med "xs:string"
    Kör följande xjc (JAXB) kommandot från den katalog där du laddade ned de båda filerna:
    xjc hafasRestTrip.xsd
    (detta kommando förutsätter att man kan köra xjc , mer info t.ex här: https://docs.oracle.com/javase/9/tools/xjc.htm )
    Då genereras 29 st Java filer i följande underkatalog som skapades vid xjc genereringen:
    hafas_rest_v1
    När man sedan ser till att dessa blir tillgängliga från sin java-kod dvs finns i classpath:en så kan man enkelt json parsa Resrobot resultat m.h.a kodgenereringen från XML schemat så här:
    import hafas_rest_v1.TripList;
    import com.alibaba.fastjson.JSON;
    ...
    String jsonResult = ...
    TripList tripList = JSON.parseObject(jsonResult, TripList.class);
    "fastjson" som används ovan:
    https://github.com/alibaba/fastjson
    https://mvnrepository.com/artifact/com.alibaba/fastjson

    Jag kan också nämna två (eller åtmistone en) anledningar till att använda json.
    En klassisk motivering för json brukar vara att det blir mindre dataöverföring.
    Dock verkar det inte vara så i ert fall och jag tror att en bidragande anledning är att ni genererar json indentering med mellanslag istället för att använda tabbar.
    Ett exempel på en xml response jag testade med blev storleken 25 kb men när jag istället valde json som format blev det 42 kb dvs mer data för json än xml.
    Så länge ert json data är större än motsvarande XML försvinner det argumentet för json, och då blir det huvudsakliga argumentet för mig att använda json istället för xml att de genererade XML klasserna (som jag alltså genererar med xjc) inte verkar fungera när man kör från Android eftersom JAXB inte verkar fungera med Android.

    Som jag har nämnt tidigare (forumet 7 januari som jag länkade ovan) tycker jag ni borde ändra xs:duration till xs:string eftersom det tydligen inte är en duration eftersom det bara är en "nästan" duration med en trafiklab-specialare med "skillnaden att det initiala P:et kan ersättas av ett R" (citat från den andra tråden).
    Jag vill även passa på att föreslå att ni publicerar kodexempel och/eller SDK för andra språk/plattformar än PHP på github, t.ex. Java och .NET.
    För närvarande verkar i alla fall PHP vara det enda programmeringsspråket på er github
    https://github.com/trafiklab

    Mvh Tomas
    Tomas
  • Tack för sån komplett svar, jag tar med denna feedback!

    Angående mellanslag i data håller jag helt med att den inte borde vara "pretty printed". Den borde inte innehålla mellanslager alls, eftersom klienter kan snygga upp den själv. Vi tar upp det med vår leverantör och hållar dig uppdaterad.

    Just nu har vi bara exempel i PHP, men tanken är att skriva vår nästa exempel/projekt i en annat språk, så att det finns exempel och SDK:er i flera språk (Java, .NET, javascript, python).

    ResRobot anrop finns i vår OpenAPI (Swagger) specifikation, som i framtiden ska innehålla specifikationer för alla API:er. Tyvärr kan vi inte lägga tid på att skriva hela svarsmodellen för ResRobot just nu. Jag kan tänka mig att vi också lägger upp vår XSD filer där, då kan vi ändra på de och kan alla föreslå ändringar. Just nu kan vi inte ändra på XSD:en som du får tillbacka från URL:en.

    Tvivla inte att säga till om det finns något mer!

    Hälsningar,
    Bert
    Bert på Trafiklab
  • Jag glömde i mitt förra inlägg ovan påpeka att man måste referera till JAXB för att kunna kompilera klasserna som genereras med xjc.
    Till exempel så här i en "build.gradle" fil:
    implementation 'javax.xml.bind:jaxb-api:2.3.1'

    Sedan fungerar det alltså ändå inte att använda XML parsning med JAXB (från Android's Java) men ovanstående är bara för att annoteringar såsom "@XmlType" ska vara tillgängliga för kompilatorn dvs för att inte orsaka kompileringsfel.
    JSON parsningen som jag nämnde i mitt föregående inlägg ovan fungerar med åtminstone följande version när man kör från Android:
    implementation 'com.alibaba:fastjson:1.1.71.android'
    (den versionen är den f.n senaste fastjson versionen för Android)

    Angående att JAXB inte fungerar från en Android så har jag testat det förut men fick det inte att fungera och har sedan också hittat mer info om att det är problematiskt.
    På sidan nedan t.ex. kan man läsa att:
    "JAXB classes are not compatible with Android due to lack of support for XML annotations and certain XML library classes, as well as several other issues."
    https://github.com/CUTR-at-USF/SiriRestClient/wiki/Parsing-JSON-and-XML-on-Android

    Mvh Tomas
    Tomas

Kommentera eller skriv ett nytt inlägg

Ditt namn och inlägg kan ses av alla. Din e-post visas aldrig publikt.