1
OOP_11
Java a XML
2
Obsah 1. Jazyk XML a formát jeho dokumentů 2. Využití DTD (Document Type Definition) při tvorbě „gramatiky“ dokumentu XML 3. Zpracování a ověření platnosti dokumentu XML objektového modelu DOM (Document Object Model) 4. Jmenné prostory XML – vyloučení nejednoznačnosti
3
1. Jazyk XML a formát jeho dokumentů • XML – eXtensible Markup Language podobně jako XHTML odvozen od SGML (Stardard Generalized Markup Language) • SGML – jazyk pro popis a definici dat navržený, tak, aby se informace daly zpracovávat jako objekty, ne jako posloupnost znaků. • SGML nesmírně flexibilní a výkonný – avšak jeho použití složité a náročné.
4
Jazyk XML • XML navržen pro popis (vyjádření) dat nezávislé na platformě. • XML je rozšiřitelný, samo-popisný a konzistentní. • XML poskytuje rovněž metadata – dají přenášeným datům širší kontext • Data lze vložit do kontextu pomocí obklopujících značek, které definují datovou strukturu a poskytují dodatečné informace a atributy. • XHTML – omezuje uživatele, klade důraz na způsob prezentace v určitém kontextu
5
Atributy
Dáma s kaméliemi Alexandre Dumas ml. Melantrich 1981 I ... ... ... ... II ...
Elementy
Osnova
6
Osnova
Professional <title>Professional Java Programming Programming Brett Spell Wrox Wrox Press showPageNumbers="Yes"> // atribut showPageNumbers PrintingPrintingPrinting tocEntry> Cut tocEntry>Cut And Paste tocEntry> Drag tocEntry>Drag And Drop tocEntry> tableOfContents>
XML
7
Professional Java Programming
Brett Spell
Table Of Contents
Printing Cut and Paste Drag and Drop Wrox
Wrox Press
Osnova HTML
8
XML nebo XHTML (HTML) • HTML je kombinací dat a instrukcí pro zobrazení v prohlížeči • zobrazovací instrukce vyjádřeny formou formátovacích značek
• data HTML jsou v úzké vazbě s formátovacími značkami – objektově orientovaný návrh, úzká vazba nežádoucí (omezuje opětovné použití) • různé formáty v prohlížeči a např. černobílém tisku • hypertextové odkazy ztrácí smysl v tištěné podobě - nahrazena např. poznámkou pod čarou
9
XML nebo XHTML (HTML) • Dokumenty HTML: – neobsahují žádné informace pro vlastní popis dat (metadata) – nemusí být správně uspořádány
• Jazyk XML: – – – –
popisuje pouze data neobsahuje žádné informace o tom, jak zobrazit data strukturu dokumentu může definovat sám uživatel definuje způsob tvorby dokumentů a způsob jejich zpracování a výměny
Správně uspořádané dokumenty (well-formed)
• každá počáteční značka musí mít koncovou značku (kromě prázdného elementu) • hodnoty atributů musí být v uvozovkách • speciální znaky používané k definici značek (tagů), jsou označeny jako rezervované znaky &…; • značky musí být do sebe vnořeny (jako bloky programu)
10
11
Element - atribut • Každá dvojice značek (počáteční a koncová) se označuje jako element. <jmeno_elementu>
• každý element může obsahovat další informace – atributy • atribut je součástí elementu a skládá se z názvu atributu a přiřazené hodnoty v uvozovkách • narodnost=“ceska”
1
"1.0"?>
3
4
-->
--> -->
article.xml
5 6
<article>
7 8
Simple <title>Simple XML XML
9 10
July July 15, 2003 2003
11 12
13
Carpenter Carpenter Carpenter
14
Cal Cal Cal
15
16 17
<summary>XML <summary>XML is pretty easy. easy.
18 19
Once Once you have mastered mastered XHTML, XML is easily
20
learned. You must remember that XML is not for
21
displaying information but for managing information.
22
12
Osnova
2
23 24
Rezervované znaky předdefinované znakové entity Název
Znak
Sekvence změny
menší než
<
<
větší než
>
>
apostrof
‘
'
uvozovka
“
&qout;
znak &
&
&
13
14
Znakové entity • • •
Character reference Odkazují se na znaky v ISO/IEC 10646, které nejsou přímo přístupné ze vstupního zařízení zápis je následující: 1. Desítková reprezentace znaku: &#[0-9]; např. řetězec “@“ představuje zavináč 2. Hexadecimální reprezentace znaku: &#x[0-9a-fA-F]; např. “@” představuje opět znak zavináč
15
Použití XML • Popis dat přenášených mezi aplikacemi • EJB – deskriptory zavádění (deployment descriptors) – je to vlastně konfigurační soubor, který popisuje způsob použití objektu modelu Enterptise JavaBeans. – Serializované objekty byly z pohledu serveru neobyčejně pohodlným médiem, uživatelé posuzovali jejich užitečnost z hlediska možností jejich editace. – XML snadno čitelný jak pro lidi, tak pro stroje.
16
Kořenové elementy • dodržení syntaktických pravidel navržených konsorciem W3C • dokument obsahuje jeden nebo více elementů, přičemž jeden z nich je tzv. kořenový element (root element). • kořenový element musí obsahovat všechny ostatní elementy
17 <slovnik> slovnik> nazev>Českoesko-anglický slovní slovník nazev> <slovo> jablkojablkojablko cesky> apple apple apple rajsk vyznam>rajské >rajské tomato tomato tomato jablo vyznam>jabloň >jabloň vyznam> appletree appletree appletree <slovo> jahod cesky>jahod -a -ový ový cesky> strawberry strawberry strawberry <slovo> malin cesky>malin -a -ový ový cesky> raspberry raspberry raspberry slovnik>
Osnova
18
Osnova
dtd"> kucharka> cislo="r01"> TÄ› špená tem janiÄŤka">T ">TÄ›stoviny Ä›stoviny se špenĂ penátem <doba_pripravy <doba_pripravy>30 pripravy>30 minut pripravy> 400g tÄ›stovin (farfalle) farfalle) 250g mraĹľ mraĹľenĂ ĹľenĂ© enĂ©ho špenà špená penátu (drcenĂ (drcenĂ˝ drcenĂ˝ nebo listy) 150g tvrdĂ© tvrdĂ©ho sĂ˝ sĂ˝ra ra 100ml smetany na vaĹ vaĹ™enĂ enĂ 4 strouĹľ strouĹľky Ĺľky ÄŤesneku esneku s sĹśl Ĺśl bilĂ bilĂ˝ bilĂ˝ pepĹ pepĹ™ <postup>TÄ› <postup>TÄ›stoviny Ä›stoviny uvaĹ uvaĹ™Ăme podle ná návodu na obale. Ĺ pená penát podusĂ podusĂme do rozmraĹľ rozmraĹľenĂ ĹľenĂ enĂ osolĂ osolĂme, me, opepĹ opepĹ™Ăme a pĹ™idá idáme rozlisovanĂ˝ rozlisovanĂ˝ ÄŤesnek. esnek. Nastrouhá Nastrouháme sĂ˝ sĂ˝r. UvaĹ UvaĹ™enĂ© enĂ© tÄ›stoviny smĂ smĂchá cháme se špenà špená penátem. Zalejeme smetanou na vaĹ vaĹ™enĂ enĂ, zasypeme sĂ˝ sĂ˝rem a krá krátce povaĹ povaĹ™Ăme. me. &chut &chut; chut; cislo="r02"> TÄ› kategorie="zelenina">TÄ›stoviny Ä›stoviny s rajÄ rajÄŤaty a zelenĂ˝ zelenĂ˝mi fazolkami nazev> <doba_pripravy <doba_pripravy>30 pripravy>30 minut pripravy> 400g tÄ›stovin (farfalle) farfalle) 200g zelenĂ˝ zelenĂ˝ch fazolek (m (mŜžou Ŝžou bĂ˝ bĂ˝t i mraĹľ mraĹľenĂ ĹľenĂ© enĂ©) 4 rajÄ rajÄŤata (nebo konzerva loupanĂ˝ loupanĂ˝ch rajÄ rajÄŤat) at) 100g tvrdĂ© tvrdĂ©ho sĂ˝ sĂ˝ra ra 3 strouĹľ strouĹľky Ĺľky ÄŤesneku esneku 2 lžà žĂce olivovĂ© olivovĂ©ho oleje bazalka s sĹśl Ĺśl <postup>TÄ› <postup>TÄ›stoviny Ä›stoviny uvaĹ uvaĹ™Ăme podle ná návodu na obale. Fazolky povaĹ povaĹ™Ăme 3 minuty. Na rozpá rozpálenĂ© lenĂ©m oleji osmaĹľ osmažà žĂme ÄŤesnek nakrá nakrájenĂ˝ jenĂ˝ na plá plátky. tky. PĹ PĹ™idá idáme fazolky a krá krátce povaĹ povaĹ™Ăme. me. Pak pĹ™idá idáme oloupaná oloupaná rajÄ rajÄŤata, ata, bazalku podle chuti a prohĹ prohĹ™ejeme. ejeme. ZamĂ ZamĂchá cháme tÄ›stoviny. stoviny. Na taliĹ taliřà posypeme nastrouhanĂ˝ nastrouhanĂ˝m sĂ˝ sĂ˝rem. rem. &chut; chut; kucharka>
19
Součásti dokumentu XML • do kořenového elementu mohou být vkládány další elementy (s atributy nebo bez nich) • vnořené elementy pak mohou obsahovat text nebo další elementy • prázdný element: <elementPriklad> <elementPriklad/>
• oddíl CDATA analyzátor (parser) nikdy neanalyzuje
]]>
2. Využití DTD (Document Type Definition) při tvorbě „gramatiky“ dokumentu XML • Je výhodné nejen deklarovat množinu elementů, které lze v rámci dokumentu použít, ale i způsob použití těchto elementů • gramatika dokumentu XML = soubor pravidel o způsobu použití elementů • DTD = soubor elementů a vztahů mezi nimi a to umožní: – ověřit, zda dokument obsahuje všechny potřebné údaje, zda jsou data kompletní a zda dokument neobsahuje žádná cizí data – popis jaká data dokument obsahuje a jak je lze zpracovat (pro jiné spolupracovníky, partnery)
20
21
Gramatika DTD • Definice typu dokumentu: – sada instrukcí určující, jaké elementy může daný
dokument obsahovat – jaké atributy mohou elementy mít – v jakém pořadí musí být v dokumentu uvedeny
• Cílem DTD je umožnit analyzátorům jazyka XML zjistit validitu dokumentu • pro spojení dokumentu s příslušným DTD souborem slouží deklarace DOCTYPE
22
DOCTYPE • DOCTYPE požaduje: – název kořenového elementu na který bude definice DTD aplikována – identifikátor SYSTEM nebo PUBLIC – URL (Uniform Resource Identifier – jednotné označování zdrojů), které určuje umístění definice DTD
23
Definování elementů • Možný obsah elementu: – prázdný – element nesmí obsahovat žádný obsah – element – element může obsahovat určené dceřinné elementy – smíšený – element může obsahovat směs dceřinných elementů a analyzovaných znakových dat (#PCDATA) – libovolný – element může obsahovat jakýkoli správně uspořádaný obsah.
• Prázdný a libovolný obsah je deklarován pomocí klíčových slov EMPTY a ANY.
24
Osnova
letter.dtd"> John Doe 123 Main St. Anytown Anytown Anytown <state>Anystate <state>Anystate Anystate 12345 555555-1234 Joe Schmoe Schmoe Box 12345 15 Any Ave. Othertown Othertown Othertown <state>Otherstate <state>Otherstate Otherstate 67890 555555-4321
--> -->
25 <salutation>Dear Sir: <paragraph>It is our privilege to inform you about our new database managed with XML. This new system allows you to reduce the load of your inventory list server by having the client machine perform the work of sorting and filtering the data. Sincerely <signature>Mr. Doe
Osnova
26
--> -->
name ( #PCDATA )> address1 ( #PCDATA )> address2 ( #PCDATA )> city ( #PCDATA )> state ( #PCDATA )> zip ( #PCDATA )> phone ( #PCDATA )> flag EMPTY> flag gender (M | F) "M">
salutation ( #PCDATA )> closing ( #PCDATA )> paragraph ( #PCDATA )> signature ( #PCDATA )>
Osnova
27
Definování elementů • Elementy se smíšeným obsahem se definují pomocí modelu obsahu (content model). Model obsahu popisuje vnitřní strukturu daného elementu, pořadí vnořených elementů a typ např. #PCDATA – libovolná data (parsed character data). Znak
Počet výskytů daného elementu
*
Ani jednou, nebo vícekrát.
+
Jednou, nebo vícekrát.
?
Ani jednou, nebo jen jednou.
28
Závorky a trubky • Závorky – znak opakování použitý mimo závorky znamená aplikaci na celý výraz v závorce
• Trubky „|” – umožňují nesekvenční uspořádání elementů – praxe: za daným elementem může následovat jeden z více možných elementů – <ELEMENT book (title | publisher | tableOfContents | overview)> – významově znamená nebo
29
Definování atributů elementu
book (title, title, author, author, publisher, publisher, tableOfContents)> tableOfContents)> title (#PCDATA)> author (#PCDATA)> publisher (#PCDATA)> tableOfContents (tocEntry+)> tocEntry+)> tableOfContents showPageNumbers CDATA "yes "yes"> yes"> tocEntry (#PCDATA)>
• atribut s implicitní hodnotou „yes“ • datový typ PCDATA – použit při definici elementů a pro analyzovaná znaková data • datový typ CDATA oznamuje, že datový atribut podporuje znaková data
30
Klíčová slova • #FIXED – zabrání překrytí definované implicitní hodnoty v DTD (konstanta) • #REQUIRED – vyžadovaná hodnota, nutno zadat (implicitní hodnota ztrácí smysl v DTD se nesmí uvádět) • #IMPLIED – v případě neexistence explicitní hodnoty se předpokládá implicitní hodnota, kterou však určí vyhodnocovací software nikoli DTD
Typy atributů Typ atributu
Popis
CDATA
Znaková data – řetězec
ID
Název jedinečný v rámci daného dokumentu (#IMLPIED, #REQUIRED)
IDREF
Odkaz na element s atributem typu ID se stejným názvem jako tento atribut typu IDREF.
IDREFS
Skupina atributů typu IDREF oddělených mezerami.
ENTITY
Název předdefinované externí entity.
ENTITIES
Skupina entit oddělených mezerami.
NMTOKEN
Název (token). Stejná pravidla jako názvy elementů, mohou začínat libovolným povoleným znakem.
NMTOKENS
Skupina tokenů oddělených mezerami.
NOTATION
Hodnota tohoto typu musí být jedním z názvů určujících typ zápisu deklarovaného v definici DTD.
Výčtové hodnoty Hodnota tohoto typu musí být jedním ze skupiny uživatelsky definovaných hodnot.
31
32
Entity •
•
•
Dokument XML se může skládat z jedné nebo více paměťových jednotek, entit. Entita je jmenné vyjádření určité části dokumentu. Každá entita je identifikovaná svým jménem a má nějaký obsah. Každý XML dokument obsahuje tzv. entitu dokumentu (document entity), která slouží jako počáteční bod pro XML procesor a obsahuje celý dokument. Rozlišujeme dva druhy entit: 1. Vnitřní - interní entity 2. Vnější - externí entity
33
Vnitřní entity • definovány pomocí záznamů Použití: Shrnuti roku ¤tYear;
34
Vnější entity • Uloženy na odděleném místě. • K definici vnější entity – definovat systémový nebo veřejný identifikátor.
• definuje parametrovou entitu nazvanou symbols. Její hodnota odpovídá obsahu souboru symbol.ent
35
Shrnutí DTD •
DTD jsou podrobné a obsažné, mají nedostatky:
1. neodpovídají specifikaci XML – nejsou rozšiřitelné a flexibilní 2. omezená typová kontrola dokumentu
3. Zpracování a ověření platnosti dokumentu XML pomocí DOM • Dokumenty v XML lze snadno analyzovat a také ověřovat jejich validitu (platnost). • Analyzátory XML dostupné z mnoha zdrojů, jedním z nich je i technologie JAXP (Java API for XML Processing) balíček javax.xml • Analyzátory XML se řídí dvěma standardy SAX (Simple API for XML) a modelem DOM (Document Object Model) navržen W3C konzorciem
36
37
Objektový model DOM • umožňuje analyzovat, ověřovat validitu, případně aktualizovat obsah • dokument načtený do paměti je udržován jako hierarchicky uspořádaná kolekce objektů • úpravou této kolekce lze změnit nejen strukturu, ale i obsah • aktualizovaný dokument pak lze ukládat na jiné místo
38
Objektový model DOM • Analyzátor DOM vytvoří v paměti kolekci objektů, které vyjadřují obsah dokumentu. • Objekty jsou implementacemi rozhraní definovaných v balíčku org.w3c.dom
Analýza procházení dokumentu v modelu DOM • Třída DocumentBuilder obsahuje metodu parse(). • Metoda parse() vrací obejkt typu Document, který plní úlohu vstupního bodu do vytvořené objektové struktury. • Jakmile máte přístup k objektu typu Document, můžete volat metodu getDocumentElement(), která vrací odkaz na kořenový element dokumentu. • Následující příklad – ukázka využívat třídy balíčku JAXP pro načtení a analýzu dokumentu.
39
Rozhraní Node bázové rozhraní v modelu DOM – přístupové metody Název metody
Popis
getNodeValue() / setNode Value() vrací / nastavuje obsah uzlu, žádný uzel null getAttributes()
vrací objekt typu NameNodeMap obsahující seznam atributů daného uzlu
appendChild(), insertBefore(), removeChild(), replaceChild()
metody pro aplikace na dceřiné uzly zkoumaného uzlu
getChildtenNodes(), getFirstChild(), getLastChild()
seznam uzlů, první a poslední
getNextSiblings(), getPrevoiusSiblings()
předchozí a následující sourozenci daného uzlu
hasChildNode()
boolean
getOwnedDocument()
Každý objekt typu Node je spojen s určitým dokumentem. Vrací odkaz na instanci typu Document.
40
41 import javax javax. .xml. xml.parsers.*; parsers.*; import org.w3c. org.w3c.dom .w3c.dom.*; dom.*; public class DOMTest { public static void main( main(String[] String[] args) args) throws Exception { DOMTest dt = new DOMTest( DOMTest(args[0]); args[0]); } public DOMTest( DOMTest(String uri) uri) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory. DocumentBuilderFactory.newInstance(); newInstance(); factory. factory.setValidating( setValidating(true); true); DocumentBuilder builder = factory. factory.newDocumentBuilder(); newDocumentBuilder(); Document doc = builder.parse( builder.parse(uri .parse(uri); uri); displayTree(doc. displayTree(doc.getDocumentElement (doc.getDocumentElement()); getDocumentElement()); } protected void displayTree( displayTree(Node node) node) { short nodeType = node. node.getNodeType(); getNodeType(); switch (nodeType) nodeType) { case Node.ELEMENT_NODE: Node.ELEMENT_NODE: printElement((Element) printElement((Element)node ((Element)node); node); break; break; case Node.TEXT_NODE: Node.TEXT_NODE: printText((Text) printText((Text)node ((Text)node); node); break; break;
Osnova
42 case Node Node.COMMENT_NODE: .COMMENT_NODE: printComment(( printComment((Comment ((Comment) Comment)node); node); break; break; case Node.CDATA_SECTION_NODE: Node.CDATA_SECTION_NODE: printCDATA(( printCDATA((CDATASection ((CDATASection) CDATASection)node); node); break; break; case Node.ENTITY_REFERENCE_NODE: Node.ENTITY_REFERENCE_NODE: printEntityReference(( printEntityReference((EntityReference ((EntityReference) EntityReference)node); node); break; break; case Node.PROCESSING_INSTRUCTION_NODE: Node.PROCESSING_INSTRUCTION_NODE: printProcessingInstruction( printProcessingInstruction( (ProcessingInstruction) ProcessingInstruction)node); node); break; break; default: } } protected void printElement(Element printElement(Element node) node) { Node child; child; Attr attr; attr; System. System.out. out.print("<" print("<" + node. node.getNodeName()); getNodeName()); NamedNodeMap attrs = node. node.getAttributes(); getAttributes(); int count = attrs. attrs.getLength(); getLength(); for (int i = 0; i < count; count; i++) { attr = (Attr (Attr)( Attr)(attrs )(attrs. attrs.item(i)); item(i)); System. System.out. out.print(" print(" " + attr. attr.getName() getName() + "=\ "=\"" + attr. attr.getValue() getValue() + "\""); }
Osnova
43 System. System.out. out.print(">"); print(">"); NodeList children = node. node.getChildNodes(); getChildNodes(); count = children. children.getLength(); getLength(); for (int i = 0; i < count; count; i++) { child = children. children.item(i); item(i); displayTree( displayTree(child); child); } System. System.out. out.print(""); } protected void printText( printText(CharacterData node) node) { System. System.out. out.print( print(node. node.getData()); getData()); } protected void printComment( printComment(Comment node) node) { System. System.out. out.print(""); -->"); } protected void printCDATA( printCDATA(CDATASection node) node) { System. System.out. out.print(""); } protected void printEntityReference( printEntityReference(EntityReference node) node) { System. System.out. out.print("&" print("&" + node. node.getNodeName() getNodeName() + ";"); } protected void printProcessingInstruction( printProcessingInstruction(ProcessingInstruction node) node) { System. System.out. out.print(""); } }
Osnova
44
Úprava předchozího programu • místo metody printElement() můžeme použít metodu toStrong(), která plní stejnou funkci jako metody printXXX()
45 import javax javax. .xml. xml.parsers.*; parsers.*; import org.w3c. org.w3c.dom .w3c.dom.*; dom.*; public class DOMTest2 { public static void main( main(String[] String[] args) args) throws Exception { DOMTest2 dt = new DOMTest2(args DOMTest2(args[0]); args[0]); } public DOMTest2(String DOMTest2(String uri) uri) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory. DocumentBuilderFactory.newInstance(); newInstance(); factory. factory.setValidating( setValidating(true); true); DocumentBuilder builder = factory. factory.newDocumentBuilder(); newDocumentBuilder(); Document doc = builder.parse( builder.parse(uri .parse(uri); uri); System. System.out. out.println(doc. println(doc.getDocumentElement (doc.getDocumentElement()); getDocumentElement()); } }
Osnova
46
Úprava dokumentů v modelu DOM • Užití modelu DOM je podobné jako v předchozím příkladě. • Postupné procházení dceřiných dokumentů kořenového elementu, až nalezený element odpovídá hledanému, pak se provede příslušná akce. • např. chceme atributu showPageNumbers přiřadit hodnotu „no“
47 book> Professional title>Professional Java Programming</ Programming title> author>Brett Spell author> publisher>Wrox Press publisher> Yes"> tocEntry>Printing tocEntry> tocEntry>Cut And Paste tocEntry> tocEntry>Drag And Drop tocEntry> tableOfContents> book>
Osnova
48 import javax javax. .xml. xml.parsers.*; parsers.*; import org.w3c. org.w3c.dom .w3c.dom.*; dom.*; public class DOMTest3 { public static void main( main(String[] String[] args) args) throws Exception { DOMTest3 dt = new DOMTest3(args DOMTest3(args[0]); args[0]); } public DOMTest3(String DOMTest3(String uri) uri) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory. DocumentBuilderFactory.newInstance(); newInstance(); factory. factory.setValidating( setValidating(true); true); DocumentBuilder builder = factory. factory.newDocumentBuilder(); newDocumentBuilder(); Document doc = builder.parse( builder.parse(uri .parse(uri); uri); NodeList children = doc.getElementsByTagName doc.getElementsByTagName(" getElementsByTagName("tableOfContents ("tableOfContents"); tableOfContents"); Element current; current; int count = children. children.getLength(); getLength(); for (int i = 0; i < count; count; i++) { current = (Element)children (Element)children. children.item(i); item(i); current. current.setAttribute("showPageNumbers", setAttribute("showPageNumbers", "no"); "no"); } System. System.out. out.println(doc. println(doc.getDocumentElement (doc.getDocumentElement()); getDocumentElement()); } }
Osnova
49
Vymazání elementu • další příklad ukazuje vymazání elementu např.
50 import javax javax. .xml. xml.parsers.*; parsers.*; import org.w3c. org.w3c.dom .w3c.dom.*; dom.*; public class DOMTest4 { public static void main( main(String[] String[] args) args) throws Exception { DOMTest4 dt = new DOMTest4(args DOMTest4(args[0]); args[0]); } public DOMTest4(String DOMTest4(String uri) uri) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory. DocumentBuilderFactory.newInstance(); newInstance(); factory. factory.setValidating( setValidating(true); true); DocumentBuilder builder = factory. factory.newDocumentBuilder(); newDocumentBuilder(); Document doc = builder.parse( builder.parse(uri .parse(uri); uri); NodeList children = doc.getElementsByTagName doc.getElementsByTagName(" getElementsByTagName("tableOfContents ("tableOfContents"); tableOfContents"); Element current current; ; Element parentElement; parentElement; int count = children. children.getLength(); getLength(); System.out.println System.out.println(" println("There ("There " + (count (count==1?" count==1?"is ==1?"is ":"are ") + count + " tableOfContents element"+ (count (count==1?"":"s")); count==1?"":"s")); for (int i = 0; i < count; count; i++) { System.out.println System.out.println(" println("Deleting ("Deleting child element number " + (i+1)); current = (Element)children (Element)children. children.item(i); item(i); parentElement = (Element)current (Element)current. getParentNode(); current.getParentNode(); parentElement. parentElement.removeChild( removeChild(current); current); } System. System.out. out.println(doc. println(doc.getDocumentElement (doc.getDocumentElement()); getDocumentElement()); } }
Osnova
Tvorba nových uzlů a jejich přidání do stromu • principiálně stejný postup jako v předchozích příkladech
51
52 import javax javax. .xml. xml.parsers.*; parsers.*; import org.w3c. org.w3c.dom .w3c.dom.*; dom.*; public class DOMTest5 { public static void main( main(String[] String[] args) args) throws Exception { DOMTest5 dt = new DOMTest5(args DOMTest5(args[0]); args[0]); } public DOMTest5(String DOMTest5(String uri) uri) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory. DocumentBuilderFactory.newInstance(); newInstance(); factory. factory.setValidating( setValidating(true); true); DocumentBuilder builder = factory. factory.newDocumentBuilder(); newDocumentBuilder(); Document doc = builder.parse( builder.parse(uri .parse(uri); uri); NodeList children = doc.getElementsByTagName doc.getElementsByTagName(" getElementsByTagName("tableOfContents ("tableOfContents"); tableOfContents"); Element current = null; null; int count = children. children.getLength(); getLength(); for (int i = 0; i < count; count; i++) { current = (Element)children (Element)children. item(i); children.item(i); // Get the list of tocEntry> items NodeList tocItems = current. current.getElementsByTagName(" getElementsByTagName("tocEntry ("tocEntry"); tocEntry");
Osnova
53 // Obtain a reference to the second one Node secondChild = tocItems. tocItems.item(1); item(1); // Create a new tocEntry> element Element newTOCItem = doc.createElement doc.createElement(" createElement("tocEntry ("tocEntry"); tocEntry"); // Create a new "Help" text node Text newText = doc.createTextNode doc.createTextNode("Help"); createTextNode("Help"); // Make it a child of the new tocEntry> element // HelpHelpHelp tocEntry> newTOCItem. newTOCItem.appendChild( appendChild(newText); newText); // Add the new tocEntry> element to tableOfContents> current. current.insertBefore( insertBefore(newTOCItem, newTOCItem, secondChild); secondChild); } System.out System.out. out.println(doc. println(doc.getDocumentElement (doc.getDocumentElement()); getDocumentElement()); } }
Osnova
54
Vytvoření nového dokumentu • Všechny instance typu Document byly vytvořeny pomocí metody parse() • Třída DocumentBuilder deklaruje metodu newDocument(), která se dá použít k získání prázdné instance typu Document
55 import javax javax. .xml. xml.parsers.*; parsers.*; import org.w3c. org.w3c.dom .w3c.dom.*; dom.*; public class DOMTest6 { public static void main( main(String[] String[] args) args) throws Exception { DOMTest6 dt = new DOMTest6(); } public DOMTest6() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory. DocumentBuilderFactory.newInstance(); newInstance(); factory. factory.setValidating( setValidating(true); true); DocumentBuilder builder = factory. factory.newDocumentBuilder(); newDocumentBuilder(); Document document = builder. builder.newDocument(); newDocument(); // Create a new Element object Element rootElement = document. document.createElement(" createElement("book ("book"); book"); // Make it the root element of this new document document.appendChild document.appendChild( appendChild(rootElement); rootElement); System.out System.out. out.println( println(document. document.getDocumentElement()); getDocumentElement()); } }
Osnova
4. Jmenné prostory XML – vyloučení nejednoznačnosti • obsah jednoho DTD souboru lze zahrnout do jiného DTD souboru – nutno definovat vnější parametrovou entitu – definovat odkaz na ni
56
57 “snacks.dtd” snacks.dtd”
cookies (#PCDATA)> cookies hasChocolate CDATA “yes” yes”> pretzels (#PCDATA)> pretzels haveSalt CDATA “yes” yes”>
“browser.dtd” browser.dtd” “preferences.dtd” preferences.dtd” %snacks; %browser;
soubor preferences.dtd se bude aplikovat na xml soubor neni jasne, jasne, ktery element cookies pouzit
Osnova
Jmenný prostor name space
• Standard jmenného prostoru je postaven na stejném principu jako balíčky tříd v Javě • Elementy nejsou spojovány s balíčku, ale s adresou URL (Unified Resource Locator) • přiřazení elementu k URL: – definovat atribut xmlns (xml name space) a přiřadit mu hodnotu, která odpovídá příslušné adrese URL – jmenný prostor můžeme přiřadit každému elementu
58
59 “snacks.dtd” snacks.dtd” “browser.dtd” browser.dtd” “preferences.dtd” preferences.dtd” %snacks; %browser;
soubor preferences.dtd se bude aplikovat na xml soubor neni jasne, jasne, ktery element cookies pouzit
Osnova
60
Prefix jmenného prostoru • Opakování jmenného prostoru může být zdlouhavé a přinášet chyby • Prefix jmenného prostoru je alias, který se může spojit s příslušnou URL adresou
61
Příklad <snacks:cookies xmlns:snacks= xmlns:snacks=http://members.aol.com/javabrewer/snacks http://members.aol.com/javabrewer/snacks/ members.aol.com/javabrewer/snacks/> Tyto kolacky mi velmi chutnaji. chutnaji. <snacks:chips> snacks:chips>Cokoladove snacks:chips> snacks:cookies>
• Alias jmenného prostoru je definován názvem atributu xmlns, dvojtečkou a názvem aliasu. • Jakmile je alias definován, může se každý element uvádět s aliasem