XMLBeans

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

XMLBeans je framework, který umožňuje zpracovávat XML soubory v Javě. Jedná se o součást Apache Software Foundation XML project.

Popis[editovat | editovat zdroj]

XMLBeans nabízí poměrně jednoduchou práci s XML soubory v Javě. Např. pro základní operace nastavení a získání hodnoty elementu používá metody set a get. Nabízí podporu pro většinu konstrukcí v schématu XML Schema. Nejprve je třeba zkompilovat XML schéma do .jar archivu, na základě kterého lze načítat a vytvářet XML soubory odpovídající danému schématu. Výsledný archiv obsahuje mimo jiné package s názvem odpovídajícím jmennému prostoru použitému v XML schématu. Package obsahuje rozhraní, které odpovídají globálním elementům z XML schématu. Kompilace se provádí z příkazové řádky příkazem:

scomp –out vysledny_archiv.jar kompilované_schéma.xsd

Lze kompilovat pouze soubory .xsd a .wsdl.

Příklady použití[editovat | editovat zdroj]

Vytvoření XML souboru[editovat | editovat zdroj]

Zde je ukázka vytvoření XML dokumentu, který odpovídá schématu album.xsd. Schéma obsahuje popis hudebního alba. Je tvořeno elementem album, který obsahuje elementy obsahující jméno interpreta, název alba, typ nosiče a elementy popisující jednotlivé skladby. Element skladba je tvořen elementy obsahujícími název skladby, délku skladby a text skladby.

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="album" type="album"></xsd:element>
    
    <!-- globální element album obsahující podelementy interpret, nazev_alba, 
    neomezené mnnožství elementů skladba a element typ_nosice--></div>
    <xsd:complexType name="album">
        <xsd:sequence>
            <xsd:element name="interpret" type="xsd:string"/>
            <xsd:element name="nazev_alba" type="xsd:string"/>
            <xsd:element name="skladba" type="skladba" maxOccurs="unbounded"/>
            <xsd:element name="typ_nosice" type="nosicTyp"/>
        </xsd:sequence>
    </xsd:complexType>
    
    <!-- popis elementu skladba s atributem cislo_skladby a podelementy nazev,
    delka a nepovinným elementem text-->
    <xsd:complexType name="skladba">
        <xsd:sequence>
            <xsd:element name="nazev" type="xsd:string"/>
            <xsd:element name="delka" type="delkaTyp"/>
            <xsd:element name="text" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
        <xsd:attribute name="cislo_skladby" type="xsd:int" use="required"/>
    </xsd:complexType>
    
    <!-- délka skladby musí odpovídat danému regulárnímu výrazu -->
    <xsd:simpleType name="delkaTyp">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[0-5]\d{1}:[0-5]\d{1}"></xsd:pattern>
        </xsd:restriction>
    </xsd:simpleType>
    
    <!-- typ nosiče musí nabývat jedné z hodnot výčtového typu -->
    <xsd:simpleType name="nosicTyp">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="CD"/>
            <xsd:enumeration value="LP"/>
            <xsd:enumeration value="MC"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

Po zkompilování schématu je třeba vzniklý .jar archiv načíst jako knihovnu k projektu. Také je třeba přidat knihovny XMLBeans, konkrétně xbean.jar z adresáře lib. Pomocí následujícího kódu se vytvoří a zvaliduje XML soubor odpovídající tomuto schématu.

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import noNamespace.Album;
import noNamespace.Skladba;

public class Vytvoreni {
    private Album album;

    @SuppressWarnings("static-access")
    public Vytvoreni() {
        try {
            //vytvoření instance odpovídající elementu album
            album = Album.Factory.newInstance();
            //nastavení hodnot elementů
            album.setInterpret("Interpret 1");
            album.setNazevAlba("Album 1");
            album.setTypNosice(album.getTypNosice().forString("MC"));
            //přidání skladby
            Skladba skladba = album.addNewSkladba();
            skladba.setCisloSkladby(01);
            skladba.setNazev("Song 1");
            skladba.setDelka("05:12");
            //pokud je výsledek validní, uloží s do souboru hudba.xml
            if(album.validate()){
            album.save(new File("hudba.xml"));
            }
            else{
                System.out.println("Dokument není validní");
            }
        } catch (IOException ex) {
            Logger.getLogger(Vytvoreni.class.getName()).log(Level.SEVERE, null, ex);}}}

Načtení XML dokumentu[editovat | editovat zdroj]

XML soubor odpovídající danému schématu lze načíst a upravovat. Následující kód načte vytvořený soubor hudba.xml, rozdělí na jednotlivé elementy, vypíše jejich obsah a následně změní jméno interpreta. Pokud bude i nadále dokument validní tak ho uloží.

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import noNamespace.Album;
import noNamespace.Skladba;
import org.apache.xmlbeans.XmlException;

public class Vypis {

    public Vypis() {
        try {
            File file = new File("hudba.xml");
            //parsování XML souboru
            Album album = Album.Factory.parse(file);
            //výpis hodnot elementů
            System.out.println(album.getInterpret());
            System.out.println(album.getNazevAlba());
            System.out.println(album.getTypNosice());
            for (Skladba skladba : album.getSkladbaArray()) {
                System.out.println(skladba.getCisloSkladby());
                System.out.println(skladba.getNazev());
                System.out.println(skladba.getDelka());
                System.out.println(skladba.getText());
            }
            //změna jména interpreta
            album.setInterpret("Novy interpret");
            //validace a uložení souboru
            if (album.validate()) {
                album.save(new File("hudba.xml"));
            } else {
                System.out.println("Dokument není validní");
            }
        } catch (XmlException ex) {
            Logger.getLogger(Vypis.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Vypis.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Výpis hodnot výčtového typu[editovat | editovat zdroj]

Pokud chceme zobrazit hodnoty výčtového typu, lze využít rozhraní SchemaType, které obsahuje informace o elementu. Ukázka výpisu hodnot výčtového typu pro druhy hudebních nosičů:

import org.apache.xmlbeans.XmlAnySimpleType;
import noNamespace.NosicTyp;

NosicTyp nosic = NosicTyp.Factory.newInstance();
//schemaType() vrací SchemaType pro daný element
//getEnumerationValues() vrací hodnoty výčtového typu jako pole prvků XmlAnySimpleType
for(XmlAnySimpleType typ : nosic.schemaType().getEnumerationValues()){
System.out.println(typ.getStringValue());
}

Dotazování pomocí XPath a XQuery[editovat | editovat zdroj]

XMLBeans umožňuje také využití dotazovacích jazyků pro XML. Pomocí těchto jazyků lze vybrat elementy podle zadaných kritérií. Je třeba použít rozhraní XMLCursor, pomocí kterého lze procházet XML dokument a měnit elementy. XMLCursor ukazuje na nějakou výchozí pozici v dokumentu. Od této výchozí pozice bude vyhledávat. Zde je ukázka, jak by mohl vypadat upravený dotaz, který vypíše počet skladeb na albu:

File file = new File("hudba.xml");
Album album = Album.Factory.parse(file);
//vytvoření kurzoru na začátku objektu, popisujícího album
XmlCursor cursor = album.newCursor();
//metoda pro vložení příkazu dotazovacího jazyka
//$this je aktuální pozice kurzoru (element album)
cursor.selectPath("$this/skladba");
//metoda getSelectionCount vrací počet elementů, odpovídajících
//zadanému výrazu
System.out.println(cursor.getSelectionCount());

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]