API pro práci s XML
T. Pitner, L. Bártek, A. Rambousek. L Grolig
FI MU Brno 2021
API pro zpracování XML
Poskytují standardizovaný přístup k XML.
Slouží k propojení aplikace a parseru.
Umožňují zpracování XML bez znalosti fyzické struktury.
Optimalizují zpracování XML.
Základní typy API:
–Stromově orientovaná API – dokument je reprezentován stromem uzlů.
–API založená na událostech – parser prochází dokument a generuje události.
–Pull API – události jsou „vytahovány“ z dokumentu.
Stromová API
●Mapují dokument do v paměti uložené stromové struktury.
●Umožňují procházení celého DOM stromu.
●Nejznámější je W3C DOM.
●Existuje řada implementací pro různé programovací jazyky:
–Java JDOM
–Java Dom4J
–Java XOM
–Python 4Suite
–PHP SimpleXML
–JavaScript DOM
Objektový Model XML
Základní rozhraní pro zpracování stromové reprezentace XML
Tři verze DOM
–DOM Level 1
–DOM Level 2
–DOM Level 3
Popsán pomocí
– IDL (Interface Description Language)
– API pro jednotlivé programovací jazyky (C++, Java, ...)
●
HTML DOM
HTML Core DOM je víceméně konsolidován XML DOM.
Navržen pro potřeby CSS.
Používá se pro dynamické programování HTML
–Skriptování pomocí jazyků VB Script, JavaScript, ...
Obsahuje rozhraní pro prostředí prohlížeče.
–Přidány proměnné pro přístup k oknům, historii, ...
Dokumentace DOM
JAXP, část věnovaná DOM Part III: XML and the Document Object Model (DOM)
Portál věnovaný DOM
DOM 1 Interface Overview
Tutoriál „Understanding DOM (Level 2)“
Použití DOM v Javě
Novější verze Javy nabízí API pro práci s DOM.
Aplikace pouze musí provést import potřebných rozhraní, tříd, atd. z balíku org.w3c.dom.
Většinou jsou zapotřebí:
–Element
–Node
–NodeList
Použití DOM v Javě
Element
–odpovídá elementu v logické struktuře dokumentu,
–Poskytuje přístup ke jménu elementu, ke jménům atributů, dceřiným uzlům (včetně textových).
–Užitečné metody
•Node getParentNode() - vrací uzel rodiče
•String getTextContent() - vrací textový obsah elementu.
•NodeList getElementsByTagName(String name) - vrací dceřiné elementy a jejich potomky
s odpovídajícím jménem.
Použití DOM v Javě
Node
–nadřazené rozhraní k Element
–odpovídá obecnému uzlu W3C DOM
–může obsahovat
•Element
•Textový uzel
•Komentář
•...
–
Použití DOM v Javě
●NodeList – seznam uzlů
–Výsledek vracený např. metodou getElementsByTagName.
–Poskytuje následující metody pro práci se seznamem:
●int length() - počet uzlů v seznamu
●Node item(int index) – vrací uzel v seznamu na daném indexu.
●Document – odpovídá uzlu dokumentu
–Rodičovský uzel kořenového elementu.
Event-based API
Při parsování uzlu Document generuje posloupnost událostí.
Technická implementace
–Callback metody
•Hollywoodský princip: „Nevolejte nám, my Vás zavoláme.“
Aplikace implementuje zpracování událostí.
–Zpracovávají údálosti generované parserem.
Pracuje na nižší úrovni než stromová rozhraní.
Aplikace musí provádět další zpracování.
Šetří paměť
–Sama o sobě negeneruje žádné perzistentní objekty.
Příklady událostí
●Příklady událostí:
–start document, end document
–start element – obsahuje také atributy, end element
–processing instruction
–comment
–entity reference.
●Nejznámější událostmi řízené API - SAX
Ukázka zpracování XML dokumentu
Zdrojový dokument:
•Hello, world!
•
•
SAX - Zpracování dokumentu
●Generované události:
●start document start element: doc
●list of attributes: empty
●start element: para
●list of attributes: empty
●characters: Hello, world!
●end element: para
●comment: That’s all folks.
●
SAX – Zpracování dokumentu
●Dokončení generovaných událostí:
●start element: hr
●end element: hr
●end element: doc
●end document
Kdy použít událostmi řízené API
●Snažší pro programátora parseru, náročnější pro aplikačního programátora.
–Chybí kompletní dokument.
●Programátor si musí udržovat stav analýzy sám.
●Vhodné pro úlohy řešitelné bez celého dokumentu.
●Obvykle nejrychlejší způsob zpracování XML dokumentu.
●Problémy lze řešit pomocí rozšíření jako je Streaming Transformation for XML (STX).
Volitelné možnosti parseru SAX
●Chování parseru SAX lze ovlivnit pomocí voleb a vlastností.
●Pro další podrobnosti viz Use properties and features in SAX parsers (IBM DeveloperWorks/XML).
Filtry SAX
●SAX fitry (implementace rozhraní org.xml.sax.XMLFilter) mohou být naprogramovány s použitím API
SAX.
●Filter přijímá vstupní události, zpracovává je a posílá na výstup.
●Více informací viz Change the events output by a SAX stream (IBM DeveloperWorks/XML).
Další zdroje o SAX
●Primární zdroj:
–http://www.saxproject.org
●SAX Tutorial on JAXP
Pull-based API
●Aplikace nezpracovává příchozí události, ale vytahuje si data ze zpracovávaného souboru.
●Dá se použít, pokud programátor zná strukturu vstupního dokumentu a může si “vytahovat” data ze
souboru.
●Protiklad API založenému na událostech.
●Velmi komfortní pro aplikačního programátora, ale implementace jsou obvykle pomalejší než
zpracování postavené na událostech.
Pull-based API pro Javu
●Java nabízí API pro XML-Pull Parser API – viz Common API for XML Pull Parsing
●a také nově vyvinuté API – Streaming API for XML (StAX) vyvinuté v rámci JCP
●
Streaming API for XML (StAX)
●API se má v budoucnosti stát součástí Java API for XML Processing (JAXP).
●Nabízí dva způsoby zpracování postavenému na Pull API:
–“vytahování” událostí pomocí iterátoru – komfortnější
–nízko-úrovňový přístup s použitím tzv. kurzoru – rychlejší.
StAX – ukázka použití iterátoru
●Viz také Oracle Java Tutorials
●V této ukázce klientská aplikace vytahuje události pomocí metody parseru next()
●Ukázková data:
●
●
●
● Yogasana Vijnana: the Science of Yoga
● Dhirendra Brahmachari
● 1966
● 81-40-34319-4
● Dhirendra Yoga Publications
● 11.50
●
StAX – zdrojový kód Java
try {
for (int i = 0 ; i < count ; i++) {
// pass the file name.. all relative entity
// references will be resolved against this
// as base URI.
XMLStreamReader xmlr = xmlif.createXMLStreamReader(filename,
new FileInputStream(filename));
// when XMLStreamReader is created,
// it is positioned at START_DOCUMENT event.
int eventType = xmlr.getEventType();
printEventType(eventType);
printStartDocument(xmlr);
// check if there are more events
// in the input stream
StAX – zdrojový kód Java
while(xmlr.hasNext()) {
eventType = xmlr.next();
printEventType(eventType);
// these functions print the information
// about the particular event by calling
// the relevant function
printStartElement(xmlr);
printEndElement(xmlr);
printText(xmlr);
printPIData(xmlr);
printComment(xmlr);
}
}
}
Kombinace stromového a událostmi řízeného zpracování
●Events → tree
●Tree → events
Events → tree
●Umožňuje buď přeskočit nebo dofiltrovat nezajímavé části dokumentu pomocí monitorování událostí.
●Vytvořit stromový model z části, která nás zajímá a tuto část zpracovat.
Tree → events
●Vytvoříme strom dokumentu (a zpracováváme ho) a
●při procházení stromu generujeme události jako bysme zpracovávali XML soubor.
●Tento přístup umožňuje integraci obou typů zpracování.
Virtual Object Model
●DOM není vytvořen v paměti, ale vytváří se podle potřeby při přístupu k jednotlivým uzlům.
●Kombinuje výhody zpracování pomocí údálosti a pomocí stromu (rychlost a komfort).
●Existuje implementace Sablotron procesor.
Alternativní stromové modely
●XML Object Model (XOM)
–XOM (XML Object Model) created as an one man project (author Elliote Rusty Harold).
–It is an interface that strictly respect XML data logical model.
–For motivation and specification see the XOM home page (http://www.xom.nu).
–You can get there the open-sourceXOM implementation and
–the API documentation, too.
–
Alternativní stromové modely
●DOM4J – prakticky použitelný stromový model
–comfortable, fast and memory efficient tree-oriented interface
–designed and optimized for Java.
–Dostupný jako open-source.
–Perfektní “kuchařka”.