XMLBeans je framework, který umožňuje zpracovávat XML soubory v Javě. Jedná se o součást Apache Software Foundation XML project.
Popis
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í
Vytvoření XML souboru
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é množství elementů skladba a element typ_nosice-->
<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
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
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
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
Externí odkazy