Podstawy XML-a Zaawansowane techniki programowania
Dokumenty XML XML = ang. Extensible Markup Language rozszerzalny język znaczników <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE osoba SYSTEM "osoba.dtd"> <osoba nr dowodu osobistego="aky123456"> <imię>adam</imię> <nazwisko>nowak</nazwisko> <język>c++</język> <język>python</język> </osoba>
Definicje typu dokumentu DTD = ang. Document Type Definition definicja typu dokumentu <!ELEMENT imię (#PCDATA)> <!ELEMENT nazwisko (#PCDATA)> <!ELEMENT język (#PCDATA)> <!ELEMENT osoba (imię, nazwisko, język*)> <!ATTLIST osoba nr dowodu osobistego ID #REQUIRED>
Struktura drzewa osoba imię nazwisko język język Adam Nowak C++ Python
Uwaga na temat kontroli prawidłowości <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE twierdzenia [ <!ELEMENT twierdzenia (prawda+)> <!ELEMENT prawda (#PCDATA)> ]> <twierdzenia> <!-- Kontrola dotyczy składni, a nie znaczenia --> <prawda> 2 = 3 </prawda> <prawda> Nie marnuję czasu. </prawda> </twierdzenia>
SVG (ang. Scalable Vector Graphics) <?xml version="1.0" encoding="utf-8" standalone="no"?> <svg id="svg2" height="1052.4" width="744.09" version="1.1"> <g id="layer1" stroke-linejoin="miter" fill-rule="evenodd" stroke="#000" stroke-linecap="butt" stroke-width="1px"> <rect id="rect2985" height="105.71" width="148.57" y="60.934" x="74.286" fill="#00f"/> <rect id="rect2987" height="80" width="131.43" y="35.219" x="142.86" fill="#f00"/> </g> </svg>
Å Å Å ÅÅ Format XML dla zapisu partii Go Å Å <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Go SYSTEM "go.dtd"> <Go> <GoGame name="gra1"> <Information> <BoardSize>9</BoardSize> </Information> <Nodes> <Node> <AddBlack at="c7"/> <AddBlack at="c3"/> <AddBlack at="e5"/> <AddBlack at="g7"/> <AddBlack at="g3"/> </Node> <White number="1" at="h7"/> <Black number="2" at="h6"/> </Nodes> </GoGame> </Go>
MusicXML 4 4 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE score-partwise SYSTEM "http://www.musicxml.org/dtds/partwise.dtd"> <score-partwise> <identification> [...] <note> <rest/> <duration>2</duration> <voice>1</voice> <type>quarter</type> </note> </measure> </part> </score-partwise>
MathML (ang. Mathematical Markup Language) ax 2 + bx + c = 0 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/math/dtd/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <math xmlns="http://www.w3.org/1998/math/mathml"> <mi>a</mi> <msup><mi>x</mi><mn>2</mn></msup> <mo>+</mo> <mi>b</mi><mi>x</mi> <mo>+</mo> <msqrt> <mi>c</mi> </msqrt> <mo>=</mo> <mn>0</mn> </math> </body> </html>
Wybrane hasła związane z XML-em XSLT (ang. Extensible Stylesheet Language Transformations) XPath XLinks XPointer DTD (ang. Document Type Definition) DOM (ang. Document Object Model) SAX (ang. Simple API for XML)
XSLT w praktyce Plik XML Arkusz XSLT Procesor XSLT Dokument wynikowy
Przykład Wejście: plik game110.xml z zapisem partii go Wyjście: obrazek game110.svg Możliwe do uzyskania za pomocą jednej komendy: $ xsltproc -o game110.svg go.xsl game110.xml (wynik na następnym slajdzie)
Uzyskany zapis gry
Encje i sekcje CDATA < = < > = > & = & " = ' = <![CDATA[ tu można wstawić jakikolwiek tekst ]]>
Definicje typu dokumentu <!ELEMENT nazwa elementu (model zawartości)> Model zawartości określa się prostymi wyrażeniami przypominającymi wyrażenia regularne. Na przykład: <!ELEMENT lista przedmiotów (przedmiot+)> <!ELEMENT przedmiot (wykładowca, forma egzaminu?)> <!ATTLIST przedmiot nazwa CDATA #REQUIRED> <!ELEMENT wykładowca (#PCDATA)> <!ELEMENT forma egzaminu (#PCDATA)>
Reguły określające zawartość elementów Reguła Znaczenie E 0 lub więcej wystąpień E E+ 1 lub więcej wystąpień E E? 0 lub 1 wystąpień E E 1 E 2... E n jeden z elementów E i E 1, E 2,..., E n E 1 po którym następują E 2,..., E n #PCDATA tekst (#PCDATA E 1 E 2... E n ) zawartość mieszana ANY dowolny element podrzędny EMPTY nie jest dozwolony jakikolwiek element podrzędny
Typy atrybutów Typ Znaczenie CDATA Dowolny łańcuch znaków (A 1 A 2... A n ) Jeden z atrybutów A i bedących łańcuchami znaków NMTOKEN, NMTOKENS Jeden lub więcej tokenów nazw ID unikalny identyfikator IDREF, IDREFS Jedno lub więcej odwołań do unikalnego identyfikatora
Wartości domyślne atrybutów Wartość domyślna #REQUIRED #IMPLIED A #FIXED A Znaczenie Atrybut jest obowiązkowy Atrybut jest opcjonalny Atrybut jest opcjonalny; jeśli nie jest podany, to zakłada się, że jest równy A Podajemy A lub nic; w obu przypadkach przyjmuje się, że jest równy A
Encje parametryczne <!ENTITY % sale "(B201 B219 B101A 09)"> <!ELEMENT przedmiot (wykładowca, forma egzaminu?)> <!ATTLIST przedmiot nazwa CDATA #REQUIRED liczba godzin NMTOKEN #IMPLIED sala %sale; "B219">
Dwa sposoby obsługi plików XML DOM SAX quiz question answer Who was... William... getdocumentelement() getfirstchild() getnextsibling() startelement(...) endelement(...) characters(...)
Interfejs Node i jego pochodne Node Attr CharacterData Document Element Text Comment CDATASection
Przykład (graf zapisany w formacie GraphML) a b c d e <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE graphml SYSTEM "http://graphml.graphdrawing.org/dtds/1.0rc/graphml.dtd"> <graphml> <graph edgedefault="undirected"> <node id="a"/><node id="c"/><node id="b"/><node id="e"/> <node id="d"/> <edge source="a" target="b"/><edge source="c" target="b"/> <edge source="c" target="e"/><edge source="c" target="d"/> <edge source="e" target="d"/> </graph> </graphml>
Fragment pliku graphml.dtd <!ELEMENT graphml (desc?,key*,(data graph)*)> <!ELEMENT graph (desc?,(((data node edge)*) locator))> <!ATTLIST graph id ID #IMPLIED edgedefault (directed undirected) #REQUIRED> <!ELEMENT node (desc?,((((data port)*,graph?)) locator))> <!ATTLIST node id ID #REQUIRED> <!ELEMENT edge (desc?,data*,graph?)> <!ATTLIST edge id ID #IMPLIED source IDREF #REQUIRED target IDREF #REQUIRED>
Program w Javie import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*;
Program w Javie (c.d.) public class MojaObslugaGrafu { public static void main(string[] args) { try { DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setvalidating(true); f.setignoringelementcontentwhitespace(true); DocumentBuilder br = f.newdocumentbuilder(); File plik = new File("gabc.xml"); Document doc = br.parse(plik); Element root = doc.getdocumentelement(); Element graf = (Element)root.getElementsByTagName("graph").item(0); int lk = graf.getelementsbytagname("edge").getlength(); System.out.println("Liczba krawędzi wynosi " + lk); } catch (Exception e) {} } }
Kompilacja i wynik działania $ javac MojaObslugaGrafu.java $ java MojaObslugaGrafu Liczba krawędzi wynosi 5 $
To samo zadanie za pomocą SAX import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.defaulthandler; class Zdarzenia extends DefaultHandler { public void startelement(string uri, String lname, String qn, Attributes attrs) throws SAXException { if (lname.equals("edge")) lk++; } public int getlk() {return lk;} private int lk=0; }
Programu ciąg dalszy public class MojaObslugaSAX { public static void main(string[] args) throws Exception { SAXParserFactory f = SAXParserFactory.newInstance(); f.setnamespaceaware(true); f.setvalidating(true); SAXParser saxparser = f.newsaxparser(); InputStream in = new FileInputStream("gabc.xml"); Zdarzenia h = new Zdarzenia(); saxparser.parse(in, h); System.out.println("Liczba krawędzi wynosi "+h.getlk()); } }
Kompilacja i wynik działania $ javac MojaObslugaSAX.java $ java MojaObslugaSAX Liczba krawędzi wynosi 5 $
Pytanie 1. Od jakich słów pochodzi skrót XML? (A) extra Modern Link (B) extensible Markup Language (C) Example Markup Language (D) X-Markup Language
Pytanie 2. Która z poniższych deklaracji poprawnie definiuje wersję XML-a? (A) <?xml version="1.0" /> (B) <xml version="1.0" /> (C) <?xml version="1.0"?> (D) <!XML version="1.0">
Pytanie 3. Od jakich słów pochodzi skrót DTD? (A) Direct Type Definition (B) Dynamic Type Definition (C) Document Type Definition (D) Do The Dance
Pytanie 4. Czy poniższy dokument XML jest poprawny syntaktycznie? <?xml version="1.0"?> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don t forget me this weekend!</body> </note> (A) Tak (B) Nie
Pytanie 5. Czy poniższy dokument XML jest poprawny syntaktycznie? <?xml version="1.0"?> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don t forget me this weekend!</body> (A) Tak (B) Nie
Pytanie 6. Które zdanie jest prawdziwe? (A) Wszystkie elementy XML muszą być właściwie domknięte. (B) Wszystkie dokumenty XML muszą mieć DTD. (C) Nazwy elementów XML muszą być pisane małymi literami. (D) Wszystkie powyższe stwierdzenia są prawdziwe.
Pytanie 7. Które zdanie jest prawdziwe? (A) Wszystkie dokumenty XML muszą mieć pewien znacznik reprezentujący korzeń. (B) W nazwach znaczników XML rozróżnia się duże i małe litery. (C) Elementy XML muszą być właściwie zagnieżdżone. (D) Wszystkie powyższe stwierdzenia są prawdziwe.
Pytanie 8. Czy poniższy dokument XML jest poprawny syntaktycznie? <?xml version="1.0"?> <note> <to age="29">tove</to> <from>jani</from> </note> (A) Tak (B) Nie
Pytanie 9. Czy poniższy dokument XML jest poprawny syntaktycznie? <?xml version="1.0"?> <note> <to age=29>tove</to> <from>jani</from> </note> (A) Tak (B) Nie
Pytanie 10. Który z łańcuchów znaków nie nadaje się na nazwę elementu XML? (A) <Note> (B) <1dollar> (C) Wszystkie trzy nazwy są niepoprawne (D) <h1>
Pytanie 11. Który z łańcuchów znaków nie nadaje się na nazwę elementu XML? (A) <age> (B) <NAME> (C) <first name> (D) Wszystkie trzy nazwy są niepoprawne
Pytanie 12. Od jakich słów pochodzi skrót XSL? (A) expandable Style Language (B) extensible Style Listing (C) extensible Stylesheet Language (D) extra Style Language
Pytanie 13. Jaka jest prawidłowa składnia używana do wskazania fragmentu dokumentu XML, w którym znaki < oraz > nie są interpretowane jako znaczniki? (A) <CDATA> Text to be ignored </CDATA> (B) <xml:cdata[ Text to be ignored ]> (C) <![CDATA[ Text to be ignored ]]> (D) <PCDATA> Text to be ignored </PCDATA>
Pytanie 14. Dany jest program: import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; public class Zad14 { public static void main(string[] args) throws Exception { DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setvalidating(true); f.setignoringelementcontentwhitespace(false); DocumentBuilder br = f.newdocumentbuilder(); File plik = new File("zad14.xml"); Document doc = br.parse(plik); Element root = doc.getdocumentelement(); NodeList nl = root.getchildnodes(); System.out.println(nl.getLength()); } }
zad14.xml Jeśli plikiem XML był: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ELEMENT a (b c)*> <!ELEMENT b EMPTY> <!ELEMENT c (#PCDATA)> ]> <a> <c> 2 + 3 = 5 * 1 </c> <b/> </a> to wynikiem działania programu będzie: (A) 2 (B) 3 (C) 4 (D) 5
Pytanie 15. Dany jest program: import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; public class Zad14 { public static void main(string[] args) throws Exception { DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.setvalidating(true); f.setignoringelementcontentwhitespace(true); DocumentBuilder br = f.newdocumentbuilder(); File plik = new File("zad15.xml"); Document doc = br.parse(plik); Element root = doc.getdocumentelement(); NodeList nl = root.getchildnodes(); System.out.println(nl.getLength()); } }
zad15.xml Jeśli plikiem XML był: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ELEMENT a (b c)*> <!ELEMENT b EMPTY> <!ELEMENT c (#PCDATA)> ]> <a> <c> 2 + 3 = 5 * 1 </c> <b/> </a> to wynikiem działania programu będzie: (A) 2 (B) 3 (C) 4 (D) 5
Pytanie 16. Jaki powstanie rysunek? import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.*; public class Rysunek { public static void dodaj(document d, Element e, int x, int y, int r) { if (r > 4) { Element okrag = d.createelement("circle"); okrag.setattribute("cx", ""+x); okrag.setattribute("cy", ""+y); okrag.setattribute("r", ""+r); okrag.setattribute("fill", "none"); okrag.setattribute("stroke", "black"); okrag.setattribute("stroke-width", "1"); e.appendchild(okrag); dodaj(d, e, x - r/2, y, r/2); dodaj(d, e, x + r/2, y, r/2); }}
Ciąg dalszy programu public static void main(string[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newdocumentbuilder(); Document d = builder.newdocument(); Element svgelem = d.createelement("svg"); d.appendchild(svgelem); svgelem.setattribute("width", "512"); svgelem.setattribute("height", "512"); Transformer t = TransformerFactory.newInstance().newTransformer(); t.setoutputproperty("doctype-system", "http://www.w3.org/tr/2000/cr-svg-20000802/dtd/svg-20000802.dtd"); t.setoutputproperty("doctype-public", "-//W3C//DTD SVG 20000802//EN"); dodaj(d, svgelem, 256, 256, 256); File f = new File("wynik.svg"); t.transform(new DOMSource(d), new StreamResult(new FileOutputStream(f))); }}
Odpowiedzi do testu 1 2 3 4 5 6 7 8 B C C A B A D A 9 10 11 12 13 14 15 16 B B C C C D A
Odpowiedź na pytanie 16.