Vývojář | Apache Software Foundation |
---|---|
Aktuální verze | 5.2.0 (16. listopadu 2023) |
Platforma | Java Virtual Machine |
Vyvíjeno v | Java |
Typ softwaru | svobodný software |
Licence | licence Apache |
Web | xmlbeans |
Některá data mohou pocházet z datové položky. |
XMLBeans je framework, který umožňuje zpracovávat XML soubory v Javě. Jedná se o součást Apache Software Foundation XML project.
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.
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);}}}
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);
}
}
}
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());
}
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());