Warning
This page is located in archive.

Zpracování zpráv datového standardu DASTA

Zadání

Vytvořte kód pro načtení, validaci a zpracování zpráv ve formátu datového standardu DASTA.


Následující části úlohy jsou povinné!

Následující úkoly začněte vypracovávat na cvičení, dopracujte doma a odevzdejte do příští neděle 22. 5. 2016 (bodována bude až kompletní práce):

  1. Stáhněte si třídy pro část standardu DASTA a potřebná XML schemata.
  2. Stahněte si DASTA zprávy a následně je v programu načtěte (mají formát xml souboru). (0.3 bodu)
  3. Proveďte validaci jednotlivých zpráv a vypište výsledek. (0.7 bodu)
  4. Převeďte informace ze zpráv do dané struktury tříd a vypište a uložte tyto informace.
    • Převedení zprávy z formátu DASTA (XML) do struktury tříd. (1.0 bodu)
    • Vypište přehledně a strukturovaně jednotlivé informace na obrazovku. (0.5 bodu)
    • Uložení zprávy ze struktury tříd do DASTA zprávy (souboru typu xml). (0.5 bod)

Poznámky k implementaci

  1. System tříd je vytvořený z XML Schemat automaticky:
    • U Java pomocí příkazu xjc.exe (příklad cesty k souboru je C:\Program Files (x86)\Java\jdk1.6.0_24\bin)
    • U C# pomocí příkazu xsd.exe (příklad cesty k souboru je C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin)
    • Při využívání automaticky vytvořených tříd je nutné si uvědomit, že systém udělá přesně to co je dáno.
  2. Struktura tříd vám přijde nepřehledná a bude mít pocit, že se v ní nedá vyznat.
    • Základní návod pro orientaci v jednotlivých blocích je na stránkách popisu struktury bloků DS.
    • Zde platí jedna rada. Kreslit, kreslit, kreslit. Všechny vztahy, všechna propojení, která pochopíte si zakreslete a vytvořte si tak diagram (graf), který vám bude sloužit jako průvodce či návod (to se hodí vždy nejen u DASTA).
  3. Pro práci s vytvořenými třídami se můžete podívat na tyto příklady:
    • Příklad inicializace a využití tříd pro Javu.

public class Main {
 
    public static void main(String[] args) throws JAXBException {
 
        /*
        * Vytvoreni factory pro jednotlive balicky
        */
        mzcr.cz.ns.dasta.ds4.ds_dasta.ObjectFactory factoryDasta = new mzcr.cz.ns.dasta.ds4.ds_dasta.ObjectFactory();
        mzcr.cz.ns.dasta.ds4.ds_type.ObjectFactory factoryDsType = new mzcr.cz.ns.dasta.ds4.ds_type.ObjectFactory();
        mzcr.cz.ns.dasta.ds4.ds_ip.ObjectFactory factoryDsIp = new mzcr.cz.ns.dasta.ds4.ds_ip.ObjectFactory();
 
        /**
         * Zakladni hlavicka
         */
        Dasta dasta = factoryDasta.createDasta();
        dasta.setVerzeDs("04.06.08");
        dasta.setIdSoubor("MEDICALC_KK11115_2005-12-12T14:46:25");
        dasta.setBinPriloha("T");
        dasta.setUr("T");
        dasta.setTypOdesm("KK");
 
        /**
         * Informace o programu, ktery generoval zpravu
         */
        ZdrojIsType zdrojIsType = factoryDasta.createZdrojIsType();
        zdrojIsType.setKodFirmy("MEDICALC");
        zdrojIsType.setKodProg("WMEXP");
        zdrojIsType.setVerzeProg("2.2.3.8");
 
        /**
         * Poskytovatel dat
         */
        PmType pm = factoryDasta.createPmType();
        AsType as1 = factoryDasta.createAsType();
        as1.setTyp("I");
        as1.setVnitrni("999");
        pm.setAs(as1);
 
        /**
         * Informace o garantovi dat
         */
        GarantDatType garantDat = factoryDsType.createGarantDatType();
        garantDat.setIdGarant("450124145");
        garantDat.setOdbornost("801");
        garantDat.setValue("MUDr. Jmeno Prijmeni");
 
        /**
         * Informace o zdravotnickem zarizeni
         */
        IsType is = factoryDasta.createIsType();
        is.setIco("12345678");
        is.setIcz("44101000");
        is.setIcp("44101882");
        AsType as2 = factoryDasta.createAsType();
        as2.setVnitrni("801");
        is.setAs(as2);
 
        /**
         * Pacientska cast
         */
        Ip ip = factoryDsIp.createIp();
        ip.setIdPac("7601019998");
        ip.setRodcis("7601019998");
        ip.setJmeno("Jmeno");
        ip.setPrijmeni("Prijmeni");
        DatXxType datDn = new DatXxType();
        datDn.setFormat("D");
        datDn.setValue("1976-01-01");
        ip.setDatDn(datDn);
        ip.setSex(SexType.M);
 
        KuZType kuZType = factoryDsIp.createKuZType();
        kuZType.setTypku("AMBUL");
        kuZType.setFazespec("ZF");
        kuZType.setIdku("MEDICALC.FNPL.1234567890");
        DatXxType datProv = new DatXxType();
        DatXxType datVydani = new DatXxType();
        datProv.setValue("2006-12-03T11:00:00");
        datVydani.setValue("2006-11-03T11:00:00");
        kuZType.setDatProv(datProv);
        kuZType.setDatVydani(datVydani);
        /*
         * Definice pracoviste, kde probehlo osetreni
         */
        PracovisteType pPracoviste = factoryDsIp.createPracovisteType();
        pPracoviste.setIcz("44101000");
        pPracoviste.setIcp("44101882");
        pPracoviste.setOdb("501");
        pPracoviste.setNazev("Chirurgická ambulance");
        kuZType.setPPracoviste(pPracoviste);
        TextType textType = factoryDsIp.createTextType();
        Ptext pText = factoryDsIp.createPtext();
        pText.setSpace("preserve");
        pText.setValue("Při fotbale si podvrkl pravé koleno. O koleno s náplní, "
                + "čéška nebolestivá, bolestivá flexe kolena koleno špatně "
                + "vyšetřitelné, zásuvka negativní RTG bez traumatu Dg.Distorsio geni l.dx"
                + "Th provedena punkce kolenního kloubu.vypunktováno 60 ml krve "
                + "bez tukových kapének, naložena ortesa Dop klidový režim kontrola zde za 2 dny dop");
        textType.setPtext(pText);
        kuZType.setText(textType);
 
        //Definice diagnozy 
        DgzType dgzType = factoryDsIp.createDgzType();
        Diag diag = new Diag();
        diag.setValue("I158");
        diag.setPoradi(1);
        dgzType.setDiag(diag);
        dgzType.setTypDg("P");
        dgzType.setIndOpravSd("N");
        List<DgzType> dgzTypes = kuZType.getDgVys();
        dgzTypes.add(dgzType);
 
        AuzkuType auzkuType = factoryDsIp.createAuzkuType();
        auzkuType.setIndikace("I");
        auzkuType.setTyppolVz("V");
        auzkuType.setDiag("I158");
        DatDuType datDu = factoryDsType.createDatDuType();
        datDu.setValue("2006-12-03T11:00:00");
        datDu.setTyp(LVTZDCUN.A);
        auzkuType.setDatDu(datDu);
        List<AuzkuType> auzkuTypes = kuZType.getAuzku();
        auzkuTypes.add(auzkuType);
 
        /**
         * Nyni je potreba navazat jednotlive bloky na hlavni tag dasta
         */
        dasta.setZdrojIs(zdrojIsType); // pridani zdroje
        dasta.setPm(pm); // pridani prijmoveho mista
        dasta.setGarantDat(garantDat);  // pridani garanta
 
        /**
         * Blok ku muze obsahovat vetsi pocet klinickych udalosti
         * (reprezentovnych kuZType), proto je potreba tento blok definovat v
         * poli (rep. ArrayListu)
         */
        ArrayList<IsType> isTypes = new ArrayList<IsType>();
        Ip.Ku ipKu = factoryDsIp.createIpKu(); // trida Ku je soucasti tridy Ip
        List<KuZType> kuZTypes = ipKu.getKuZ(); // Je vyvoren seznam klinickych udalosti, ktery je soucasti Ip.Ku
        kuZTypes.add(kuZType); // prida se vytvorena klinicka udalost
        ip.setKu(ipKu); // klinicke udalosti se pridaji jako blok k bloku pacienta        
        is.setIp(ip);  //  krok pridani bloku pacienta do bloku odesilatele             
        isTypes.add(is);  // Pro pripad, ze by zprava obsahovale vice udalosti je halvni blok is zarazen do seznamu
        dasta.setIs(isTypes); // prirazeni cele zpravy do obalu bloku datsa              
 
        /**
         * Vytvori xml z hlavniho objektu dasta
         */
        JAXBContext context = JAXBContext.newInstance(Dasta.class);
        JAXBElement<Dasta> element = factoryDasta.createExpenseReport(dasta);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        /**
         * Namapuje elementy jednotlivych namespace na nami pozadovane nazvy
         */
        marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
 
            @Override
            public String[] getPreDeclaredNamespaceUris() {
                return null; //new String[]{WellKnownNamespace.XML_SCHEMA_INSTANCE};
            }
 
            @Override
            public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
                if (namespaceUri.equals("urn:cz-mzcr:ns:dasta:ds4:ds_dasta")) {
                    return "ds";
                }
                if (namespaceUri.equals("urn:cz-mzcr:ns:dasta:ds4:ds_ip")) {
                    return "dsip";
                }
                return suggestion;
 
            }
        });
 
        /**
         * Vypis xml zpavy
         */
        marshaller.marshal(element, System.out);
    }   
}  

  • Příklad inicializace a využití tříd pro C# (příklad je převzat ze stránek Tima Trotta). Pozor! Jedná se pouze o příklad.
  • Další příklady jsou také na StackOverflow.

xsd soubor

<?xmlversion="1.0"encoding="utf-8"?>
<xs:schemaid="CATALOG"xmlns=""xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:elementname="CATALOG"msdata:IsDataSet="true"msdata:Locale="en-US">
    <xs:complexType>
      <xs:choiceminOccurs="0"maxOccurs="unbounded">
        <xs:elementname="CD">
          <xs:complexType>
            <xs:sequence>
              <xs:elementname="TITLE"type="xs:string"minOccurs="0"/>
              <xs:elementname="ARTIST"type="xs:string"minOccurs="0"/>
              <xs:elementname="COUNTRY"type="xs:string"minOccurs="0"/>
              <xs:elementname="COMPANY"type="xs:string"minOccurs="0"/>
              <xs:elementname="PRICE"type="xs:string"minOccurs="0"/>
              <xs:elementname="YEAR"type="xs:string"minOccurs="0"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>
C# kód
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
usingSystem.Xml.Serialization;
 
namespace ConsoleApplication1
{
  class Program
  {
    staticvoid Main(string[] args)
    {
      StreamReader str =new StreamReader("cd_catalog.xml");
      XmlSerializer xSerializer =new XmlSerializer(typeof(CATALOG));
 
      CATALOG myCdCatalogue =(CATALOG)xSerializer.Deserialize(str);
 
      foreach(CATALOG.CDRow cd in myCdCatalogue.CD)
      {
        Console.WriteLine(cd.TITLE);
        Console.WriteLine(cd.ARTIST);
        Console.WriteLine(cd.COUNTRY);
        Console.WriteLine(cd.COMPANY);
        Console.WriteLine(cd.PRICE);
        Console.WriteLine(cd.YEAR);
        Console.WriteLine();
      }
      str.Close();
    }
  }
}

Hodnocení

  • Povinné: Úloha je hodnocena maximálně 3 body. Hodnoceno bude vypracování úlohy odevzdané do 22. 5. 2016 na UploadSystem.

Důležité: Před odevzdáním si ověřte, zda práce splňuje jednotlivé body zadání PŘESNĚ. Pokud si nejste jisti, co některá část zadání znamená, včas se ptejte. Při nedodržení specifikace neočekávejte body z milosti.

Odevzdává se prostřednictvím UploadSystemu.

courses/17bieht/dasta2016.txt · Last modified: 2016/05/16 14:45 by bursam