Podstawy XML-a. Zaawansowane techniki programowania

Podobne dokumenty
Wykorzystywanie parsera DOM w programach Java i PL/SQL

Procesowanie dokumentów XML

JAVA I XML ZAGADNIENIA: DOM, SAX, JAXB, XMLDecoder i XMLEncoder, ANT.

XML i Java 1. XML Budowa dokumentu XML. Projektowanie systemów informatycznych

LABORATORIUM 5 WSTĘP DO SIECI TELEINFORMATYCZNYCH WPROWADZENIE DO XML I XSLT

Dokument poprawnie sformułowany jest zgodny z ogólnymi zasadami składniowymi:

XML i Java. Technologie zarządzania treścią. dr inż. Robert Perliński rperlinski@icis.pcz.pl

XPath XML Path Language. XPath. XSLT część 1. XPath data model. Wyrażenia XPath. Location paths. Osie (axes)

Zaawansowane aplikacje WWW - laboratorium

Sosnowiec, dn... Imię i nazwisko...

Kurs WWW Język XML, część I

Wprowadzenie do technologii XML

Plan dzisiejszego wykładu. Narzędzia informatyczne w językoznawstwie. XML - Definicja. Zalety XML

XML DTD XML Schema CSS

Plan prezentacji. Przetwarzanie dokumentów XML JAXP SAX JAXP SAX DOM STAX XSLT. Przedmiot: XML i jego zastosowania. Dr inż. Stanisław Polak JAXB

SAX i DOM wykorzystanie XML-a we własnych aplikacjach. Simple API for XML Parsing Document Object Model

Dokumenty SEDU składają się z dwóch części: Opisu sprawy Formularza elektronicznego

Plan prezentacji DTD. Wiązanie DTD z dokumentem XML Deklaracja typu dokumentu. Co to jest DTD. Wstęp. Przedmiot: XML i jego zastosowania

XML extensible Markup Language. Paweł Chodkiewicz

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

XML i nowoczesne technologie zarządzania treścią

WYKŁAD 2 DTD DOCUMENT TYPE DEFINITION CZĘŚĆ 1

Programowanie obiektowe

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 06

Przykładowy dokument XML

XML we własnych aplikacjach

Modele dostępu do dokumentu XML. Implementacja modelu parser. SAX2 pakiet org.xml.sax. Działanie modelu SAX przykład

Jak wygląda XML? Definiowanie typów dokumentów. Struktura logiczna dokumentu XML. Podstawy składni XML. Definiowanie języków. Poprawność dokumentów

Extensible Markup Language (XML) Wrocław, Java - technologie zaawansowane

DTD - encje ogólne i parametryczne, przestrzenie nazw

Jak wygląda XML? Definiowanie typów dokumentów Część 1. DTD. Struktura logiczna dokumentu XML. Podstawy składni XML. Definiowanie języków

XML we własnych aplikacjach

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 05

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

WYKŁAD 1 METAJĘZYK SGML CZĘŚĆ 1

Wykład 7: Pakiety i Interfejsy

Języki i metody programowania Java INF302W Wykład 3 (część 1)

XHTML - Extensible Hypertext Markup Language, czyli Rozszerzalny Hipertekstowy Język Oznaczania.

5.14 JSP - Przykład z obiektami sesji Podsumowanie Słownik Zadanie... 86

XML extensible Markup Language. część 3

Wprowadzenie do arkuszy stylistycznych XSL i transformacji XSLT

Wywoływanie metod zdalnych

Jak wygląda XML? Definiowanie typów dokumentów Część 1. DTD, XML Schema. Struktura logiczna dokumentu XML. Składnia XML. Encje predefiniowane.

Katalog książek cz. 2

XML w sosie własnym. Standard XML wraz z DTD, przestrzenie nazw, projektowanie struktury dokumentów. Patryk Czarnik. Instytut Informatyki UW

29. Poprawność składniowa i strukturalna dokumentu XML

BAZY DANYCH. Dr hab. Sławomir Zadrożny, prof. PR

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

XML - wprowadzenie. <message> <text> Dobrze </text> </message> <message> <text> Źle </message> </text> <message> <message> <text> Źle.

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

SAX2 pakiet org.xml.sax

Technologie Internetu HTML. Aleksander Denisiuk.

TIN Techniki Internetowe zima

Programowanie obiektowe

Usługi WWW. dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska Opole zlipinski@math.uni.opole.pl

INTEGRACJA I EKSPLORACJA DANYCH

Aplikacje internetowe laboratorium XML, DTD, XSL

Podstawy (X)HTML i CSS

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Definiowanie typów dokumentów Część 2. Przestrzenie nazw, XML Schema

JAVA W SUPER EXPRESOWEJ PIGUŁCE

XML w sosie własnym. Standard XML wraz z DTD, przestrzenie nazw, projektowanie struktury dokumentów. Patryk Czarnik. Instytut Informatyki UW

Zaawansowane aplikacje WWW - laboratorium

Wykład 8: Obsługa Wyjątków

XQuery. XQuery. Przykład. dokument XML. XQuery (XML Query Language) XQuery 1.0: An XML Query Language. W3C Recommendation

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie obiektowe

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Wykład 4: Klasy i Metody

Rola języka XML narzędziem

XML in own applications

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

HTML DOM, XHTML cel, charakterystyka

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie internetowe

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Wywoływanie metod zdalnych

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

SOAP. Autor: Piotr Sobczak

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Wykład 2 xaml, cz Czym jest xml?

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Przykładowy dokument XML

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Przetwarzanie dokumentów XML za pomocą XSLT ( r.)

Programowanie obiektowe

c TP: anything: 13 listopada 2004 roku 1

Remote Method Invocation 17 listopada 2010

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

public interface TravelAgent { public void makereservation(int cruiseid, int cabinid, int customerid, double price); }

Technologie zarządzania treścią

Transkrypt:

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 < = < > = > & = & " = &apos; = <![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.