XIQE/Interfaces
< Zpět na XIQE
Za tuto oblast zodpovídá Zdeněk Zikán.
Obsah
- 1 Úvod
- 2 Připomínky
- 3 Úvod
- 4 Existující aplikační rozhraní pro práci s XML v jazyce Java
- 5 Požadavky uživatele
- 6 Současný stav XIQE a návrh změn
- 7 Obsah přiloženého CD
- 8 Bibliografie
Úvod
Sem budu průběžně dávat to, co sepíšu. Dělám to v DocBooku a z něj generuji Wiki, takže pokud budete chtít něco opravit, tak to napište do sekce Připomínky, abych to vzápětí nepřepsal novější verzí.
Připomínky
[sem pište svoje připomínky]
Úvod
XML je jazyk, který je v současnosti velice populární pro svou flexibilitu a používaný v nejrůznějších oblastech. Jedná se o jazyk pro sloužící pro značkování dat a je vhodný hlavně tehdy, když mají data hierarchickou strukturu. Pro potřeby ověření různých metod indexování XML dat a zjištění jejich efektivity vznikl projekt XIQE (XML Indexing and Querying Engine). Více informací o XIQE je možné nalézt v diplomové práci jeho autorky Ada01.
Účelem této práce je umožnit použití XIQE nejen jako experimentálního systému, ale také jako XML databáze a navrhnout tedy rozhraní pro použití systému „z vnějšku“, tak, aby uživatel mohl systém využívat bez znalosti jeho fungování a architektury.
Existující aplikační rozhraní pro práci s XML v jazyce Java
Java API for XML Processing (JAXP)
Java API for XML Processing
je sada několika API vybraných jako základní, nejdůležitějších API pro zpracování XML v Javě. Od verze Javy 1.5 je JAXP 1.3 součástí Java Core API. Z tohoto důvodu zde uvádím přehled a stručný popis tříd, které jsou součástí JAXP.
javax.xml*
javax.xml
Balík javax.xml
obsahuje jedinou třídu a to XMLConstants
, která definuje pouze konstanty (statické finální atributy typu String
), často používané v XML dokumentech, například URI různých často používaných jmenných prostorů (XMLSchema, RelaxNG, XMLNS) či prefixy definované specifikací XML.
javax.xml.datatypes
Poskytuje mapování typů vyjadřujících datum v Javě a XML.
Obsahuje třídy:
-
DatatypeConstants
— obsahuje konstanty používané v operacích s datem.
-
DatatypeConstants.Field
— typově bezpečná výčtová třída reprezentující šest polí třídyDuration
(viz dále).
-
DatatypeFactory
— tovární třída umožnující vytvářet instance třídDuration
aXMLGregorianCalendar
(viz dále).
-
Duration
— třída reprezentující časové intervaly podle W3C XML Schema 1.0 a implementující různé operace nad nimi (porovnávání, sčítání, …).
-
XMLGregorianCalendar
— třída reprezentující „kalendář“; umožňuje nastavit datum a čas a z nich získat buď XML reprezentaci, nebo instanci třídyjava.util.GregorianCalendar
, umožňující pokročilejší práci s datem a časem.
- Výjimku
DatatypeConfigurationException
.
javax.xml.namespaces
Umožňuje práci s jmennými prostory XML.
Obsahuje rozhraní NamespaceContext
sloužící k získání prefixu (resp. prefixů) daného URI nebo URI daného prefixu a třídu QName
reprezentující tzv. kvalifikované jméno elementu, tj. identifikátor, skládající se ze jména, prefixu a URI.
javax.xml.parsers
Poskytuje třídy umožňující zpracování XML dokumentů.
-
DocumentBuilder
— slouží k převedení řetězcové reprezentace XML dokumentu na DOM reprezentaci (instanci třídyorg.w3c.dom.Document
).
-
DocumentBuilderFactory
— tovární třída pro vytváření parserů (instancí třídyDocumentBuilder
) s různým nastavením — lze určit, jestli má být parser validující, má brát v potaz komentáře, jmenné prostory, má ignorovat ignorovatelné bílé místo apod.
-
SAXParser
— abstraktní třída definující API, které „obaluje“ třídy implementujícíorg.xml.sax.XMLReader
.
-
SAXParserFactory
— abstraktní třída definující API pro získání pro konfiguraci a vytvoření objektu typuSAXParser
.
- Třídu výjimky
ParserConfigurationException
a chybovou tříduFactoryConfigurationError
.
javax.xml.transform
Definuje obecná API pro zpracování transformačních instrukcí a transformaci.
Rozhraní:
-
ErrorListener
— umožňuje vytvořit vlastní ošetření chyb při transformaci. Instanci třídy implementující toto rozhraní je možné zaregistrovat pomocí metodysetErrorListener
třídyTransformer
.
-
Result
— objekt implementující toto rozhraní obsahuje informace potřebné pro vytvoření stromu výsledku transformace. Toto rozhraní je implementováno (v Java Core API) třídamiDOMResult
,SAXResult
aStreamResult
.
-
Source
— objekt implementující toto rozhraní obsahuje informace potřebné pro jeho použití pro vstup (XML soubor nebo transformační instrukce). Toto rozhraní je implementováno (v Java Core API) třídamiDOMSource
,SAXSource
aStreamSource
.
-
SourceLocator
— slouží především pro účely označení místa (v XML souboru nebo transformačních instrukcích), kde došlo k chybě. Toto rozhraní je implementováno (v Java Core API) třídouDOMLocator
.
-
Templates
— objekt implementující toto rozhraní je „runtime“ reprezentací zpracovaných transformačních instrukcí. Pomocí metodynewTransformer
se pak vytvoří objektTransformer
(viz dále).
-
URIResolver
— objekt implementující toto rozhraní může být zavolán transformačním procesorem k získání objektuSource
odpovídající danému URI (použitém vdocument()
,xsl:import
neboxsl:include
).
Třídy:
-
OutputKeys
— poskytuje řetězcové konstanty pro nastavení výstupních vlastností objektuTransformer
, nebo získání výstupních vlastností objektuTransformer
neboTemplate
. Např. konstanty
-
Transformer
— abstraktní třída. Instance její podtřídy provádí transformaci zdrojového stromu na cílový.Transformer
může být použit opakovaně a jeho nastavení se mezi jednotlivými transformacemi zachovává (pokud ho nepřenastavíme). Objekt typuTransformer
by se neměl používat ve více souběžně spuštěných vláknech najednou. Různé instance typuTransformer
mohou být použity ve více souběžných vláknech.
-
TransformerFactory
— tovární třída pro vytváření objektů typuTransformer
aTemplates
.
- Výjimky
TransformerConfigurationException
aTransformerException
a chybovou tříduTransformerFactoryConfigurationError
.
javax.xml.transform.dom
Implementuje API specifické pro DOM.
Obsahuje rozhraní DOMLocator
, třídy DOMResult
a DOMSource
, jejichž funkce je zřejmá (viz jim příslušná rozhraní SourceLocator
, Result
a Source
v balíku javax.xml.transform
).
javax.xml.transform.sax
Implementuje API specifické pro SAX2.
Rozhraní:
-
TemplatesHandler
— umožňuje vytvoření objektů typuTemplates
z událostí SAX2. Je potomkemorg.xml.sax.ContentHandler
a může být tedy použit na jeho místě. Poté, co přijdou všechny SAX události, objektTemplates
může být vytvořen pomocí metodygetTemplates()
.
-
TransformerHandler
— je potomkemorg.xml.sax.ContentHandler
,org.xml.sax.DTDHandler
aorg.xml.sax.ext.LexicalHandler
.
Třídy:
-
SAXTransformerFactory
— abstraktní třída rozšiřujícíTransformerFactory
a poskytující tovární metody specifické pro SAX. Umí vytvářet objektyTransformerHandler
aTemplatesHandler
(obojí potomkyContentHandler
) aXMLFilter
.
-
SAXResult
— verzeResult
specifická pro SAX. Pokud je mu předánContentHandler
, je nastaven pro příjem SAX2 událostí z transformace.
-
SAXSource
— verzeSource
specifická pro SAX. Umožňuje nastavit vstupní zdrojInputSource
aXMLReader
, který jej bude číst. (Obojí vizorg.xml.sax
.)
javax.xml.transform.stream
Implementuje API specifické pro streamy a URI.
Třídy:
-
StreamResult
— reprezentuje výsledek transformace (XML, čistý text, HTML, nebo jiný značkovaný text).
-
StreamSource
— reprezentuje zdroj transformace.
javax.xml.validation
Poskytuje API pro validaci XML dokumentů, tedy ověření toho, že daný XML dokument je instancí daného XML schématu. Toto API umožňuje odděluje validaci XML dokumentu od jeho parsování, díky čemuž je možné použít různá schémata pro validaci (DTD, W3C XML Schema, RelaxNG) a jednoduše spolu za běhu párovat XML dokumenty a schémata.
Třídy:
-
Schema
— reprezentuje schéma, tedy gramatiku, sadu omezení, na která je XML dokument testován. Třída je neměnitelná a vláknově bezpečná. Instance se vytváří obvykle pomocíSchemaFactory
, odvozené podtřídy však mohou používat i konstruktor (protected
).
-
SchemaFactory
— tovární třída pro vytvářeníSchema
objektů. Jedná se o kompilátor schémat, který přečte externí reprezentaci schématu a převede ji do podoby použitelné pro validaci. Po načtení schématu je pomocí URI jeho jmenného prostoru určeno, o jaký se jedná jazyk.SchemaFactory
není vláknově bezpečná a reentrantní, tzn. nesmí být použita z více než jednoho vlákna najednou a pokud běží metodanewSchema
, nesmí být znovu rekurzivně volána.
-
SchemaFactoryLoader
— tovární třída pro vytváření objektůSchemaFactory
. Tato třída je určená pro použití validačními API.
-
TypeInfoProvider
— poskytuje přístup k informacím o typech elementů a atributů tak, jak je zjišťujeValidatorHandler
. Implementaci získáme pomocíValidatorHandler
.getTypeInfoProvider()
. MetodygetElementTypeInfo
agetAttributeTypeInfo
pak vrací objekt implementujícíorg.w3c.dom.TypeInfo
, který nese informace o typu.
-
Validator
— procesor pro porovnání XML dokumentu s daným XML schématem. Třída není vláknově bezpečná a reentrantní, tzn. nesmí být použita z více než jednoho vlákna najednou a pokud běží metodavalidate
, nesmí být znovu rekurzivně volána. Metoda validate sice má parametry typuSource
aResult
, ale přijímá pouzeSAXSource
aDOMSource
resp.SAXResult
aDOMResult
.
-
ValidatorHandler
— validátor pro SAX proudy. Třída implementuje rozhraníorg.xml.sax.ContentHandler
, není vláknově bezpečná ani reentrantní.ValidatorHandler
kontroluje, jestli SAX události odpovídají omezením popsaným vSchema
a případně modifikuje SAX události (např. přidává implicitní hodnoty, pokud nejsou uvedeny).
javax.xml.xpath
Poskytuje API nezávislé na objektovém modelu dokumentu pro vyhodnocování XPath dotazů.
Rozhraní:
-
XPath
— poskytuje přístup k prostředí vyhodnocování XPath dotazů — umožňuje zjišťovat a nastavovat zpracovatele proměnných a funkcí (XPathVariableResolver
,XPathFunctionResolver
), kompilovat a provádět XPath dotazy.
-
XPathExpression
— reprezentuje zkompilovaný XPath dotaz, který tak lze vícekrát provádět na různých vstupních datech.
-
XPathFunction
— reprezentuje XPath funkci. Obsahuje jedinou metoduObject evaluate(List args)
.
-
XPathFunctionResolver
— poskytuje přístup k množině uživatelem definovaných proměnných — metodaresolveFunction
je volána kvalifikovaným jménem funkce a její aritou a vracíXPathFunction
.XPathFunctionResolver
není třeba pro vestavěné funkce XPath a nelze jej použít na jejich přepsání. Lze jej použít pouze na funkce v jiném jmenném prostoru.
-
XPathVariableResolver
— poskytuje přístup k množině uživatelem definovaných proměnných — metodaresolveVariable
převede kvalifikované jméno proměnné na její hodnotu (tedyObject
jí odpovídající).
Třídy:
-
XPathConstants
— nabízí konstanty reprezentující datové typy XPath 1.0 a URI pro objektový model DOM.
-
XPathFactory
— tovární třída pro objektyXPath
.
Výjimky XPathException
, XPathExpressionException
, XPathFactoryConfigurationException
, XPathFunctionException
.
W3C DOM (org.w3c.dom*)
W3C DOM je objektový model dokumentu budovaný jako strom. Stromové modely dokumentu jsou vhodné pro reprezentaci XML dokumentu v paměti a snadnou práci s ním. Jejich nevýhoda je právě nutnost reprezentovat dokument (resp. uzel) celý v paměti a tedy vyšší paměťová režie, což je činí nevhodnými pro zpracování velkých XML dokumentů.
Schéma použití DOM v JAXP
org.w3c.dom
Poskytuje rozhraní na práci s DOM (Document Object Model). Toto API umožňuje číst a upravovat obsah a strukturu dokumentu
Rozhraní:
-
Node
— je hlavním rozhraním tohoto balíku reprezentuje uzel ve stromu XML dokumentu. Je možné pracovat se strukturou podstromu (odebírat, přidávat a zjišťovat informace o dceřinný a sourozeneckých uzlech, zjišťovat informace o rodičích, ...). Potomky tohoto rozhraní jsouAttr
,CDATASection
,CharacterData
,Comment
,Document
,DocumentFragment
,DocumentType
,Element
,Entity
,EntityReference
,Notation
,ProcessingInstruction
aText
. Některé z nich se liší svými možnostmi, např.Text
neumožňuje mít dceřinné uzly (přestože rozhraníNode
má metoduappendChild
) a přidání takového uzlu vyvolá výjimku. Informace o uzlu je možné získat i bez jeho přetypování a to pomocígetNodeType
,getNodeName
agetNodeValue
.
-
DOMConfiguration
— reprezentuje konfiguraci dokumentu a tabulku rozpoznaných parametrů. Konfigurovat lze např. to, zda se dokument bude validovat oproti schématu, jaké schéma bude použito, jestli mají být ve stromu dokumentu i komentáře, jak se má zacházet s bílým místem, odkazy na entity apod.
-
DOMError
— popisuje vzniklé chyby (řetězec, popisující chybu, typ chyby, závažnost, umístění a data, kterých se chyba týká).
-
DOMErrorHandler
— slouží pro ošetření vzniklých chyb — obsahuje jedinou metoduboolean handleError(DOMError)
.
-
DOMImplementation
— poskytuje metody pro provádění operací nezávislých na konkrétní instanci DOM stromu. Umožňuje vytvořit dokument požadovaného typu a zjišťovat a využívat vlastnosti konkrétní implementace DOM.
-
DOMImplementationList
— reprezentuje uspořádanou kolekci implementací DOM (DOMImplementation
).
-
DOMImplementationSource
— umožňuje poskytovat jednu nebo více implementací DOM na základě vlastností a verzí, které uživatel od implementace požaduje.
-
DOMLocator
— popisuje umístění v dokumentu (použitelné např. pro identifikaci místa, kde vznikla chyba).
-
DOMStringList
— reprezentuje uspořádanou kolekci hodnotDOMString
(reprezentovaných jakoString
).
-
NamedNodeMap
— reprezentuje kolekci uzlů, ke kterým je možné přistupovat podle jména. (Uzly jsou uspořádány a může k nim tak být přistupováno i podle indexu, ale toto uspořádání není definováno, slouží pouze k umožnění přístupu ke kolekci i jako k výčtu.)
-
NameList
— reprezentuje uspořádanou kolekci dvojic jméno a jmenný prostor (jmenný prostor může být i null).
-
NodeList
— reprezentuje uspořádanou kolekci uzlů (Node
).
-
TypeInfo
— reprezentuje typ (tj. dvojici jméno typu a URI jmenného prostoru) odkazovaný uzlem typuElement
neboAttr
specifikovaný ve schématu přiřazeném k dokumentu.
-
UserDataHandler
— s každým uzlem (Node
) je možné asociovat dvojice klíč a libovolný objekt — uživatelská data (pomocí metodysetUserData
). Ke každé dvojici je možné přiřaditUserDataHandler
, který je zavolán, když je uzel (ke kterému jsou data přiřazena) klonován, importován, adoptován (tj. přesouván z jednoho dokumentu do druhého), přejmenováván nebo mazán.
Dále obsahuje výjimku DOMException
vyhazovanou v případě, že nějakou operaci nelze provést.
org.w3c.dom.bootstrap
Obsahuje třídu DOMImplementationRegistry
— tovární třídu pro získávání implementací DOMImplementation. Implementace DOM můžou tuto třídu upravit, aby dodržely nové bezpečnostní standardy nebo k dodatečnému upravení chování některých tříd DOMImplementationSource
.
org.w3c.dom.events
Balík definuje způsob zpracování událostí podle DOM2 Events Specification. Obsahuje výjimku EventException
a rozhraní:
-
Event
— reprezentuje událost, poskytuje informace o kontextu události objektu, který události ošetřuje. Potomky tohoto rozhraní jsou:LSLoadEvent
aLSProgressEvent
z balíkuorg.w3c.dom.ls
a dále:
-
EventTarget
— toto rozhraní by měly implementovat všechny uzly (Node
) v DOM implementaci, která podporuje DOM Event Model. (A tedy je možné získat objekt tohoto typu přetypováním jakéhokoliv objektuNode
.) Toto rozhraní umožňuje zaregistrovatEventListener
a pomocí něj vyřizovat události zasílané objektu typuEventTarget
.
-
EventListener
— hlavní způsob zpracování událostí. Uživatel implementujeEventListener
a zaregistruje ho na uzlu (který implementujeEventTarget
).
-
DocumentEvent
— slouží k vytváření událostí typů podporovaných implementací DOM. Používá se tehdy, když je nevhodné nebo zbytečné, aby uživatel vytvářel událost sám. Pokud nedostačují události z implementace DOM, uživatel může vytvořit vlastní.
org.w3c.dom.ls
Balík obsahuje rozhraní pro načítání a ukládání dat a výjimku LSException
.
Rozhraní:
-
DOMImplementationLS
— obsahuje tovární metody pro vytváření objektůLSInput
(načítání),LSOutput
(ukládání),LSParser
().
-
LSInput
— reprezentuje vstupní zdroj dat. Umožňuje aplikaci zapouzdřit informace o vstupních datech (veřejný a systémový identifikátor, URI, znakový a/nebo bytový proud) do jediného objektu.
-
LSOutput
— reprezentuje informace o výstupu. Umožňuje aplikaci zapouzdřit informace o výstupních datech (systémový identifikátor, URI, znakový a/nebo bytový proud) do jediného objektu.
-
LSParser
— implementující objekt je schopen vytvořit nebo rozšířit existující DOM strom ze zdrojeLSInput
.
-
LSSerializer
— poskytuje API pro serializaci, tedy převod DOM stromu do XML dat (LSOutput
). Serializace nijak neovlivňuje původní DOM strom.
-
LSParserFilter
— pokud je objekt tohoto typu zaregistrován u parseru (LSParser
), jsou jeho metody volány během tvorby stromu a je možné tak upravovat nebo odebírat uzly, případně i předčasně ukončit tvorbu stromu.
-
LSSerializerFilter
— pokud je objekt tohoto typu zaregistrován u objektuLSSerializer
, jsou jeho metody volány během serializace určit, které uzly budou serializovány.
-
LSLoadEvent
— reprezentuje událost značící dokončení načítání dokumentu. Je potomkem výše zmiňovanéorg.w3c.dom.events.Event
.
-
LSProgressEvent
— reprezentuje událost značící průběh načítání dokumentu, která upozorňuje aplikaci na pokrok v průběhu načítání dokumentu.
-
LSResourceResolver
— slouží pro přesměrování odkazů na externí zdroje, např. při tvorbě XML dokumentu z databáze.
SAX (org.xml.sax*)
SAX SAX01 (Simple API for XML)
je API sloužící k vytváření reprezentace XML dokumentu na základě událostí zasílaných XML parserem. Výhodou SAXu (a obecně API založených na událostech) oproti DOMu je hlavně to, že není nutné uchovávat celý dokument v paměti, což je činí vhodnými pro zpracování i velkých XML dokumentů.
Pro představu uvádím příklad zpracování XML dokumentu SAX parserem. Následující dokument:
<?xml version="1.0" ?> <korenovy_element> <jiny_element>nějaký text</jiny_element> </korenovy_element>
by měl vygenerovat následující posloupnost událostí:
start document start element: korenovy_element start element: jiny_element characters: nějaký text end element: jiny_element end element: korenovy_element end document
Schéma použití SAX v JAXP
org.xml.sax
Poskytuje základní SAX API.
Rozhraní:
-
Attributes
— reprezentuje seznam XML atributů, ke kterým je možno přistupovat pomocí indexu, jména kvalifikovaného jmenným prostorem nebo jména kvalifikovaného prefixem.
-
ContentHandler
— hlavní rozhraní, které většina SAX aplikací implementuje. Dostává informace o logickém obsahu dokumentu. Aplikace, která potřebuje být informována o SAX událostech implementujeContentHandler
a zaregistruje ho u SAX parseru (metodasetContentHandler
).
-
DTDHandler
— dostává informace o základních událostech souvisejících s DTD — notacích a neparsovaných entitách.
-
ErrorHandler
— pokud aplikace potřebuje sama ošetřovat chyby, implementujeErrorHandler
a zaregistruje ho uXMLReader
(setErrorHandler
). Hlášení chyb tímto způsobem má mít přednost před vyhazováním výjimek.
-
EntityResolver
— pokud chce aplikace implementovat vlastní zacházení se vstupními zdroji, implementujeEntityResolver
a zaregistruje ho uXMLReader
(setEntityResolver
).EntityResolver
pak umožňuje převádět veřejné a systémové identifikátory na zdrojeInputSource
. Toho lze využít např. pokud XML dokument generujeme z databáze nebo jiných specializovaných vstupních zdrojů nebo naše aplikace používá URI místo URL.
-
XMLReader
— základní rozhraní pro implementaci SAX2. Umožňuje nastavovat vlastnosti, registrovat objekty na zpracování obsahu, DTD, chyb a spustit parsování dokumentu.
-
XMLFilter
— potomekXMLReader
, který se chová stejně jakoXMLReader
, ale umožňuje zpracovávat události z jiných XMLReaderů a řetězit tak zpracování.
-
Locator
— slouží k zjištění místa dokumentu, kde došlo k události. Objekt implementující toto rozhraní se předá pomocí metodysetDocumentLocator
objektuContentHandler
.
Třída:
-
InputSource
— zapouzdřuje informace o vstupním zdroji.
Dále balík obsahuje výjimku SAXException
a její potomky SAXNotRecognizedException
(nerozeznaný identifikátor), SAXNotSupportedException
(nepodporovaná operace), SAXParseException
(chyba během parsování nebo varování).
org.xml.sax.helpers
Obsahuje pomocné třídy jako např. základní implementace některých rozhraní.
-
AttributesImpl
— základní implementace rozhraníAttributes
, která obsahuje navíc metody pro úpravu, aby list mohl být upravován a znovu používán.
-
DefaultHandler
— základní třída pro SAX2 aplikace, která poskytuje implementaci rozhraníEntityResolver
,DTDHandler
,ContentHandler
,ErrorHandler
.
-
LocatorImpl
— poskytuje běžnou implementaci rozhraníLocator
.
-
XMLFilterImpl
— základní třída pro odvozování XML filtrů. Nedělá nic, pouze předává požadavky XMLReaderu a události jejím příslušným zpracovatelům a podtřídy můžou podle potřeby jednotlivé metody překrývat.
- Adaptéry
ParserAdapter
(obaluje starší rozhraníParser
ze SAX1 a reprezentuje ho jakoXMLReader
) aXMLReaderAdapter
(dělá opak).
-
XMLReaderFactory
— tovární třída na implementaceXMLReader
.
-
NamespaceSupport
— zapouzdřuje logiku pro práci s jmennými prostory XML.
org.xml.sax.ext
Obsahuje rozšíření rozhraní SAX2, které SAX2 ovladače nemusí nutně podporovat. Jsou nezávislá na jádru SAX2.
Rozhraní:
-
Attributes2
— potomek rozhraníAttributes
. Poskytuje dodatečné informace o atributech (jestli je atribut deklarovaný v DTD a jestli byla dosazena jeho implicitní hodnota podle DTD).
-
DeclHandler
— zpracovává události týkající se DTD deklarací (deklarace atributu, elementu, interní a externí entity).
-
EntityResolver2
— potomek rozhraníEntityResolver
. Rozšiřuje toto rozhraní o nové mapování odkazů na externí entity na vstupní zdroje (InputSource
).
-
LexicalHandler
— slouží ke zpracování lexikálních informací (komentáře, hranice CDATA sekcí, entit a DTD deklarací).
-
Locator2
— potomek rozhraníLocator
. Rozšiřuje informace poskytované tímto rozhraním o kódování a verzi XML dané entity.
Třídy:
-
Attributes2Impl
— rozšíření rodičovskéhoAttributesImpl
o funkce, které jsou navíc v rozhraníAttributes2
.
-
DefaultHandler2
— rozšíření rodičovskéhoDefaultHandler
implementující navíc rozhraníLexicalHandler
,DeclHandler
,EntityResolver2
.
-
Locator2Impl
— rozšíření rodičovskéhoLocatorImpl
o dodatečné informace o entitách (kódování a verze XML).
XML:DB API
XML:DB API je projekt XML:DB Initiative na vytvoření aplikačního rozhraní sloužícího pro sjednocení přístupu k různým nativním XML databázím. Jedná se o jakousi obdobu ODBC nebo JDBC u relačních databází.
XML:DB API v současnosti implementují například databáze eXist nebo Apache Xindice (dříve dbXML).
Za základ XML:DB API by se daly označit:
- Ovladače — každá databáze implementující XML:DB API poskytuje ovladač, který zapouzdřuje přístup k databázi. Jedná se o implementaci rozhraní
Database
a jsou spravovány třídouDatabaseManager
.
- Kolekce — kontejnery pro uchovávání XML dokumentů (obvykle stejného nebo podobného typu). Jedná se o jakousi obdobu tabulek v relačních databázích.
- Služby — implementují různou funkčnost. Každá databáze může nabízet různé služby. Některé z nich jsou jsou definovány v XML:DB API (implementace XPath dotazů, XUpdate, správu kolekcí, transakce, ...), další může definovat konkrétní databáze.
- Zdroje — reprezentuje různé typy dat (XML, binární data). Jedná se o rozhraní
Resource
.
- Úrovně API (API Core Levels)
— jelikož XML:DB API má být modulární, je nutné pro zjednodušení práce vývojářů s různými databázemi vlastnosti shlukovat (např. podle důležitosti). XML:DB API definuje dvě úrovně — 0, kterou musí implementovat každá databáze implementující XML:DB API a 1, která tuto rozšiřuje o rozhraní XPathQueryService
.
Základní jednoduché případy použití XML:DB ukazuje např. XMLDB01.
org.xmldb.api
Obsahuje pouze třídu DatabaseManager
, která je vstupním bodem celého API. Umožňuje pracovat s implementacemi databází, zjišťovat API Core Levels a získávat kolekce.
org.xmldb.api.base
Poskytuje základní rozhraní:
-
Database
— zapouzdřuje funkcionalitu ovladače databáze (rozhodnutí, zda umí zpracovat dané URI, jaké API Core Level databáze implementuje a získání kolekce). Každá XML databáze toto rozhraní musí implementovat. Instance je pak zaregistrována uDatabaseManager
a uživatel by měl dále přistupovat pouze k němu (s výjimkou inicializace třídyDatabase
).
-
Collection
— reprezentuje kolekci zdrojů dat (Resource
) uloženou v XML databázi. Mezi kolekcemi může (ale nemusí) být stromová hierarchie. Kolekce poskytuje přístup ke zdrojům (Resource
) a službám (Service
), které nad kolekcemi a zdroji v nich mohou operovat.
-
Resource
— kontejner pro data uložená v databázi. Jelikož tato data mohou být různých typů, je nutné zjistit před jejich použitím typ (getResourceType()
) a podle toho data (Object getContent()
) přetypovat. XML:DB API definuje dvě podrozhraní —BinaryResource
aXMLResource
.
-
Service
— poskytují různá rozšíření ke kolekcím a práci s nimi. Některé služby jsou definovány už v XML:DB API —CollectionManagementService
,TransactionService
,XPathQueryService
,XUpdateQueryService
. Samotné rozhraníService
neobsahuje žádné speciální metody, je na uživateli, aby si obdrženouService
přetypoval na příslušný podtyp.
-
ResourceIterator
— iterátor přes zdroje (Resources
). I přes název se nejedná o potomkajava.util.Iterator
.
-
ResourceSet
— množina zdrojůResource
, obvykle získaná jako výsledek dotazu.
-
Configurable
— poskytuje metody pro nastavení a zjištění vlastností objektu. Potomky tohoto rozhraní jsouCollection
,Database
,Service
a dále z balíkuorg.xmldb.api.modules
rozhraníCollectionManagementService
,TransactionService
,XPathQueryService
aXUpdateQueryService
.
Dále třídu ErrorCodes
obsahující konstanty s chybovými kódy a výjimku XMLDBException
vyhazovanou všemi chybami v XML:DB API (typ chyby je rozlišován právě přes konstanty v ErrorCodes
).
org.xmldb.api.modules
Obsahuje některé specializace rozhraní Resource
a Service
:
-
BinaryResource
— reprezentuje binární data uložená v databázi.
-
XMLResource
— reprezentuje XML data uložená v databázi. Umožňuje je získat prostřednictvím uzlu DOM stromu nebo pomocí SAX (přesorg.xml.sax.ContentHandler
).
-
CollectionManagementService
— umožňuje základní manipulacemi s kolekcemi uvnitř databáze (přidání a odstranění). Pokročilejší správa se u různých databází liší, proto ji toto rozhraní neřeší.
-
TransactionService
— umožňuje spojit operace nad kolekcemi do transakcí.
-
XPathQueryService
— umožňuje provedení XPath dotazů nad kolekcí nebo zdrojem v kolekci.
-
XUpdateQueryService
— umožňuje provedení XUpdate dotazů nad kolekcí nebo zdrojem v kolekci.
Dom4j
Rozhraní a implementace pro práci s XML DOM. TODO: dokončit!
JDOM
Nástroj pro práci s XML DOM (podobně jako dom4j). Slouží jako reprezentace XML dokumentu. K jeho vytvoření používá XML parser (který sám neimplementuje). JDOM má za cíl být co nejsnadněji použitelné, ale jelikož není stavěné na rozhraních, ale na třídách, je jeho použití v XIQE nevhodné a proto se jím dále nebudu zabývat. Zmiňuji jej především proto, že patří ke známým nástrojům pro práci s DOM. JDOM01
Xerces Native Interface
Xerces Native Interface je rozhraní, které mohou implementovat XML parsery (implementuje jej např. Xerces2 parser). Je postaveno na stejných principech jako SAX (tj. zasílá informace o toku dokumentu), ale s několika rozdíly:
- XNI se snaží poskytovat všechny informace o dokumentu, beze ztráty. SAX například nepředává takové informace jako kódování externích entit.
- XNI umožňuje vytvořit řetěz komponent parseru, kde mohou být informace o dokumentu plně modifikovány. SAX umožňuje pouze malé možnosti takovéto modifikace při čtení XML dokumentu. Toho lze využít například pro vytvoření DOM nebo SAX parseru HTML dokumentu, vložení dokumentů odkazovaných přes XInclude tak, aby to bylo transparentní vůči validátoru apod.
XNI obsahuje sadu rozhraní, pomocí kterých je možné definovat komponenty a konfiguraci parseru.
StAX
StAX (Streaming API for XML) je API založené stejně jako SAX nebo XNI na proudovém zpracování XML dokumentu. Narozdíl od SAX a XNI nepracuje jako „push“ (tj. parser zasílá události klientovi v průběhu zpracování XML dokumentu), ale „pull“ API (tj. klient ovládá chod parseru). Díky proudovému zpracování zachovává výhody SAX a XNI (malou paměťovou režii oproti rozhraním založených na vytváření stromu v paměti, jako je DOM, schopnost zpracovávat rozsáhlé XML dokumenty). Důvod, proč vznikla „pull API“ je ten, že tento přístup je většině programátorů bližší a vzniklé aplikace bývají jednodušší. StAX oproti SAX a XNI umožňuje snadněji vytvářet XML dokumenty. Další výhodou je to, že lze zpracovávat více XML dokumentů najednou v jednom vlákně. (To je způsobené tím, že zpracování řídí klient.)
XMLPULL
Jedná se o starší „pull“ rozhraní než StAX. Důvod, proč se mu nebudu podrobněji věnovat je ten, že v něm byly dělány kompromisy v návrhu určené k minimalizaci spotřeby paměti (především je upřednostňován procedurální přístup před objektovým), aby mohlo být používáno v zařízeních s malou pamětí v prostředí J2ME a nehodí se příliš pro použití v prostředí desktopových nebo serverových aplikací.
JAXB (Java Architecture for XML Binding)
Framework JAXB umožňuje vázat XML schémata na Java objekty a jejich prostřednictvím pak zpracovávat XML dokumenty. Poskytuje rozhraní pro načtení XML dokumentu jako stromu Java objektů (unmarshalling) a jeho opětovné uložení do XML (marshalling). Umožňuje pracovat s XML dokumenty bez znalosti modelů pro zpracování XML jako DOM, SAX, apod. Třídy v Javě by pak měly reprezentovat pouze vztahy definované v XML schématu.
Ke zpracování pomocí JAXB dochází takto:
- Pro XML data, která se budou zpracovávat je k dispozici nějaké schéma (např. XML Schema).
- Na základě schématu je kompilátorem vazeb vytvořena sada tříd jazyka Java založených na daném schématu.
- Vygenerované třídy jsou obvyklým způsobem zkompilovány do bytekódu.
- XML dokument (v podobě souboru na disku, DOM stromu, SAX zdroje, řetězce v paměti apod.) splňující dané schéma je načten a zpracován. Z dříve připravených tříd je vygenerován strom reprezentující strukturu a obsah XML dokumentu. Součástí tohoto kroku může být i validace.
- Prostřednictvím vytvořeného stromu a rozhraní vygenerovaných tříd je možné „dokument“ upravovat. Během těchto úprav nemusí být validní vůči zadanému schématu (i když je možné validaci explicitně vyvolat).
- Výsledek se pak opět převede na jeden nebo více XML dokumentů. Součástí tohoto kroku může být i validace.
Schéma fungování JAXB
Castor XML
Castor XML je framework, který umožňuje definovat vztah mezi XML daty a objekty, které je reprezentují a tyto dvě reprezentace mezi sebou převádět. Castor využívá sadu popisovačů (ClassDescriptor a FieldDescriptor) k tomu, aby objekt v Javě převedl na jeho XML reprezentaci a naopak.
Požadavky uživatele
Pro navržení vhodného rozhraní je potřeba stanovit požadavky uživatele na systém. Dokumenty jsou v systému XIQE, stejně jako v jiných XML databázích, tříděny do kolekcí. Některé XML databáze podporují hierarchickou strukturu kolekcí. Bez ohledu na současný stav projektu XIQE byl určen seznam důležitých operací, které by systém měl v budoucnu podporovat. Uživatel by tedy měl mít možnost:
- založit kolekci dokumentů
- vrátit kolekci dokumentů na základě názvu
- smazat kolekci dokumentů
- přejmenovat, resp. přesunout kolekci dokumentů
- vložit dokument (v podobě objektu
File
,String
, DOM stromu, SAX nebo StAX zdroje) do kolekce
- s kolekcí dokumentů:
- vyhledat v ní dokument podle názvu
- provést nad ní XPath dotaz
- provést nad ní XQuery dotaz
- provést nad ní XUpdate
- s dokumentem:
- provést nad ním XPath dotaz (TODO: opravdu? nevadí nám to, že uživatel dokument může měnit a v kolekci tedy nebude aktuální podoba dokumentu, nad kterou se dotaz prování?)
- převést jej na DOM (
Document
), SAX (SAXResult
), StAX (XMLEventReader
)
- s výsledkem XPath dotazu:
- převést jej na DOM (
Document
), SAX (SAXResult
), StAX (XMLEventReader
) — s tímto si zatím nejsem jistý; můžeme takhle vrátit výsledek XPath dotazu, když to nemusí být well-formed XML dokument? (může obsahovat např. jen atributy)
Současný stav XIQE a návrh změn
Vzhledem ke svému zaměření systém XIQE má podporu pro různé způsoby ukládání XML dat — umožňuje tak ověřit různé způsoby indexace a efektivního uchovávání a vyhledávání v datech. Uživatel by však měl dostat k dispozici pohodlný nástroj se sadou přepřipravených ukládacích struktur, mezi kterými si může snadno vybrat. Systém XIQE nemá žádnou podporu pro snadnou manipulaci s kolekcemi. Dále nepodporuje hierarchické struktury kolekcí — o tomto však bylo rozhodnuto, že se nyní nebude implementovat, jelikož uživatel si může hierarchické kolekce simulovat pomocí prostředků souborového systému (pomocí struktury adresářů). Momentálně je k dispozici podpora pouze pro ukládání kolekcí na lokálním souborovém systému a v paměti. Zvažuje se možná budoucí podpora klient-server architektury a komunikace prostřednictvím počítačové sítě. Pozdější implementace už by hierarchické kolekce mohly podporovat, pravděpodobně prostřednictvím XML:DB API, kde již pro hierarchické kolekce podpora je.
XML:DB API
Jako základní rozhraní, které bude systém XIQE podporovat bylo vybráno XML:DB API. Obsahuje podporu pro vše, co je potřeba a uživateli může být známé — je použito v několika různých XML databázových systémech.
Jeho implementace byla započata, třídy jsou v balíku org.xiqe.xmldb
. Tyto třídy budou používat org.xiqe
, které již slouží jako jakési „nativní“ rozhraní XIQE. Některé třídy byly implementovány za použití tříd XML:DB API SDK — tyto poskytují některé základní metody a naše třídy je pak rozšiřují. Pravděpodobně však bude od použití SDK upuštěno z důvodů jeho závislosti na nástroji Xerces Xer01 a z licenčních důvodů (pokud bychom chtěli SDK upravit, museli bychom zachovat jeho licenci, a některé části XIQE by pak museli používat XML:DB Initiative Software License).
JAXP
Jako další rozhraní, které bude podporováno bylo pro svou velkou rozšířenost vybráno JAXP. Podpora pro model dokumentu W3C DOM již v současnosti v XIQE je podporováno jako jeden z modelů dokumentu (druhý, který je momentálně podporován je Dom4j). Podpora pro SAX byla odložena jako úkol s nižší priporitou. Podpora pro transformační API z JAXP je záležitostí, která je na straně uživatele, proto ji XIQE podporovat nebude. Ve spolupráci s Bc. Petrem Vlčkem byla navržena podpora pro XPath pomocí JAXP a na její implementaci pracuje v rámci své diplomové práce.
Rozhraní org.xiqe
Rozhraní a třídy v tomto balíku byly původně určeny jako vnější rozhraní, zatím je však nikdo neimplementoval. Jelikož XML:DB API nabízí vše, co je třeba, bude určeno jako primární rozhraní pro uživatele s tím, že, org.xiqe
bude sloužit jako rozhraní, které bude využíváno rozhraním org.xiqe.xmldb
, které k němu bude tvořit jakýsi wrapper a umožňovat co nejtransparentnější manipulaci s různými typy kolekcí — tj. aby uživatel mohl pracovat úplně stejným způsobem s kolekcí v paměti, na lokálním disku i na vzdáleném serveru. Rozhraní org.xiqe
by pak mohlo být využito v případě, že bychom v budoucnu narazili na něco, co by nebylo možné pomocí XML:DB API snadno vyřešit. Dále je uživatel bude moci využívat v případě, že mu nevadí nepřenositelnost jeho softwaru na jinou XML databázi. (V případě používání XML:DB API by uživateli při přechodu k jiné XML databázi, která nabízí nadmnožinu toho, co umí XIQE, mělo stačit změnit URI, pomocí kterých přistupuje ke kolekcím)
Obsah přiloženého CD
Součástí práce je i přiložené CD, kde jsou k dispozici:
- zdrojový kód této práce ve formátu XML (DocBook)
- tato práce ve formátech LaTeX, PDF a XHTML, vygenerovaná pomocí šablony fithesis a nástroje XSLT2 Mgr. Jana Pavloviče
- aktuální revize ze Subversion repository projektu XIQE
- JavaDoc dokumentace k popisovaným rozhraním
Bibliografie
- Zkratka: Sta01, název: Introduction to dbXML, autor: Kimbro Staken
- Zkratka: Sta02, název: An Introduction to the XML:DB API, autor: Kimbro Staken , datum: 9. 1. 2002
- Zkratka: Ada01, název: Systém pro indexování XML dokumentů, autor: Štěpánka Adámková , releaseinfo: diplomová práce, publikoval: Masarykova Univerzita , místo: Brno , datum: 2005
- Zkratka: XMLDB01, název: API Use Cases, autor: Kimbro Staken , publikoval: Members of the XML:DB API Mailing List , datum: 20. 9. 2001
- Zkratka: SAX01, název: SAX Project
- Zkratka: JDOM01, název: JDOM Project
- Zkratka: Har01, název: An Introduction to StAX, autor: Elliotte Rusty Harold , datum: 17. 10. 2003
- Zkratka: Har02, název: The XMLPULL API, autor: Elliotte Rusty Harold , datum: 14. 9. 2002
- Zkratka: Kaw01, název: The JAXB API, autor: Koshuke Kawaguchi , datum: 8. 1. 2003
- Zkratka: Enh01, název: Enhydra Zeus project website, publikoval: ObjectWeb Consortium
- Zkratka: Xer01, název: Xerces project website, publikoval: The Apache Software Foundation
- Zkratka: JWST, název: The Java Web Services Tutorial, publikoval: Sun Microsystems
- Zkratka: Ogb01, název: Manage XML collections with XAPI, autor: Uche Ogbuji , datum: 11. 1. 2005