Aplikacje internetowe i rozproszone - laboratorium

Podobne dokumenty
Zaawansowane aplikacje WWW - laboratorium

Zaawansowane aplikacje WWW - laboratorium

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Projektowanie aplikacji internetowych laboratorium

Aplikacje WWW - laboratorium

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Aplikacje WWW - laboratorium

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Zaawansowane aplikacje internetowe - laboratorium

Wykorzystywanie parsera DOM w programach Java i PL/SQL

Aplikacje internetowe i rozproszone - laboratorium

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Aplikacje WWW - laboratorium

Zaawansowane aplikacje internetowe laboratorium

Programowanie Obiektowe GUI

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Aplikacje WWW - laboratorium

Bezpieczne uruchamianie apletów wg

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Programowanie w Javie

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna

5.2. Pierwsze kroki z bazami danych

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Programowanie obiektowe zastosowanie języka Java SE

Języki i metody programowania Java Lab2 podejście obiektowe

Katalog książek cz. 2

Java Platform Micro Edition

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Algorytmy z powrotami. Algorytm minimax

Db4o obiektowa baza danych wersja.net

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

Git, Bitbucket, IntelliJ IDEA

Zaawansowane aplikacje internetowe

Klasy i obiekty cz II

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

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

Aplikacje w środowisku Java

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Viatoll Calc v1.3. Viatoll Calc. Instrukcja użytkownika. Strona 1

Programowanie wielowarstwowe i komponentowe

Wykład 4: Klasy i Metody

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

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

Podstawy i języki programowania

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Programowanie Systemów Czasu Rzeczywistego

Web Services (SOAP) Ćwiczenie 1

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Ćwiczenia 9 - Swing - część 1

WPROWADZENIE DO JĘZYKA JAVA

Enterprise JavaBeans (EJB)

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Zaawansowane aplikacje internetowe - laboratorium

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Podstawy XML-a. Zaawansowane techniki programowania

ZSBD ćwiczenie 4. Obiektowe systemy zarządzania bazą danych. Przygotowanie środowiska pracy. Wymagania: ZSBD ćwiczenie 4

JDK można pobrać ze strony

Krótki kurs obsługi środowiska programistycznego Turbo Pascal z 12 Opracował Jan T. Biernat. Wstęp

Programowanie obiektowe

Wybierz kategorię Java Web i typ projektu Web Application. Kliknij przycisk Next >.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Wykład 2: Podstawy Języka

Moduł Handlowo-Magazynowy Przeprowadzanie inwentaryzacji z użyciem kolektorów danych

Programowanie w języku Java. Bazy danych SQLite w Javie

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 2).

akademia androida Składowanie danych część VI

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

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

Laboratorium 9 (Więcej Aktywności, w Androidzie)

Instalowanie VHOPE i plików biblioteki VHOPE

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

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

ZAPOZNANIE SIĘ Z TWORZENIEM

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Zaawansowane aplikacje internetowe laboratorium

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

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

Metody Metody, parametry, zwracanie wartości

Załącznik 1 instrukcje instalacji

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

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

Laboratorium 7 Blog: dodawanie i edycja wpisów

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Centrum Informatyki "ZETO" S.A. w Białymstoku. Wysyłanie danych o licencjach i zezwoleniach do CEIDG w systemie ProcEnt Licencje

Aplikacje RMI Lab4

W dowolnej przeglądarce internetowej należy wpisać poniższy adres:

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Wykład 7: Pakiety i Interfejsy

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Transkrypt:

Aplikacje internetowe i rozproszone - laboratorium Przetwarzanie XML (DOM API, parser DOM, XPath) Do wykonania ćwiczeń wykorzystane zostanie środowisko programistyczne Eclipse SDK 3.1 (lub nowsza wersja; do pobrania z http://www.eclipse.org). Wymagane jest środowisko J2SE 5.0 (lub nowsza wersja). Autor ćwiczeń: Paweł Boiński Ćwiczenie 1 Celem ćwiczenia jest przygotowanie aplikacji w języku Java, która będzie służyła do stworzenia dokumentu XML za pomocą Java DOM API. Generowany dokument będzie zawierał spis części komputerowych wraz z ich cenami i stanami magazynowymi. Aplikacja powinna umożliwiać dodawanie i usuwanie części, wyświetlanie spisu części oraz transformację i zapis drzewa DOM do pliku XML. Struktura drzewa DOM dla przechowywania informacji o częściach została przedstawiona na poniższym rysunku. korzeń węzeł elementu węzeł atrybutu węzeł tekstowy ID=10 procesorx 450 <part> <computer_parts> <name> <price> <quantity> <poznan> <warszawa> <?xml version="1.0" encoding="utf-8"?> <computer_parts> <part ID="10"> <name>procesorx</name> <price>450</price> <quantity> <poznan>35</poznan> <warszawa>24</warszawa> </quantity> </part> <part ID="25"> <name>mysz</name> <price>65</price> <quantity> <poznan>5</poznan> <warszawa>16</warszawa> </quantity> </part>... </computer_parts> 35 24

1. Uruchom środowisko Eclipse. Na ekranie wyświetlone zostanie okienko z pytaniem o przestrzeń roboczą (ang. workspace), czyli katalog dyskowy, który będzie używany w bieżącej sesji programu Eclipse. Załóżmy, że tym katalogiem będzie c:\programy. Jeśli taki katalog nie istniał, zostanie on założony automatycznie. 2. Z menu głównego wybierz File New Project.

3. Wybierz typ kreatora Java Project. Kliknij przycisk Next >. 4. Podaj nazwę projektu, np. xmllab1. Kliknij przycisk Next >.

5. Kolejne okienko pozwala na zdefiniowanie dodatkowych lub zmianę istniejących ustawień dla projektu. Dla budowanej aplikacji wystarczy domyślna konfiguracja. Kliknij przycisk Finish. 6. Z menu głównego wybierz Window Open Perspective Java. (Ta czynność nie powoduje otwarcia żadnego, nowego okienka).

7. Zamknij zakładkę Welcome w głównym oknie (jeśli była otwarta). 8. Kliknij prawym przyciskiem myszy na nazwie projektu w zakładce Package Explorer. Z menu kontekstowego wybierz New Class.

9. Podaj nazwę pakietu, np. myxmlpackage oraz nazwę klasy, np. Shop. Zaznacz opcję public static void main(string [] args). Kliknij przycisk Finish. 10. Postępując podobnie jak w punktach 8-9, utwórz klasę XMLHandler. Uwaga! Nie zaznaczaj opcji public static void main(string [] args).

11. Klasa XMLHandler będzie odpowiedzialna za przechowywanie dokumentu XML w postaci drzewa DOM oraz za operacje wykonywane na tym dokumencie. Konstruktor klasy będzie tworzył nowy dokument XML. Wprowadź następujący kod do pliku tej klasy. package myxmlpackage; import org.w3c.dom.*; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.transform.transformer; import javax.xml.transform.transformerfactory; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamresult; import java.io.fileoutputstream; public class XMLHandler Document xmldoc; public XMLHandler() DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try DocumentBuilder parser = factory.newdocumentbuilder(); xmldoc = parser.newdocument(); catch (Exception e) System.out.println(e.toString()); 12. Dokument XML musi posiadać główny węzeł, który obejmuje całość dokumentu. W przypadku modelowanej aplikacji jest to węzeł computer_parts. Dodaj do klasy XMLHandler poniższą metodę odpowiedzialną za jego utworzenie. public void addroot() Element root = (Element) xmldoc.createelement("computer_parts"); xmldoc.appendchild(root); 13. Kolejnym etapem ćwiczenia jest zdefiniowanie operacji służących do wstawiania i usuwania opisu podzespołów komputerowych z dokumentu XML. Dodaj poniższe definicje metod do klasy XMLHandler. public void addpart(string r_id, String r_name, String r_price, String r_quantity1, String r_quantity2) Node namenode, pricenode, quantitynode, citynode; Node rootnode = xmldoc.getdocumentelement(); Element newpartnode = xmldoc.createelement("part"); newpartnode.setattribute("id", r_id); rootnode.appendchild(newpartnode); namenode = xmldoc.createelement("name"); Node newtextnode = xmldoc.createtextnode(r_name); namenode.appendchild(newtextnode); newpartnode.appendchild(namenode); pricenode = xmldoc.createelement("price"); newtextnode = xmldoc.createtextnode(r_price); pricenode.appendchild(newtextnode); newpartnode.appendchild(pricenode);

quantitynode = xmldoc.createelement("quantity"); newpartnode.appendchild(quantitynode); citynode = xmldoc.createelement("poznan"); newtextnode = xmldoc.createtextnode(r_quantity1); citynode.appendchild(newtextnode); quantitynode.appendchild(citynode); citynode = xmldoc.createelement("warszawa"); newtextnode = xmldoc.createtextnode(r_quantity2); citynode.appendchild(newtextnode); quantitynode.appendchild(citynode); public void delpart(string r_id) Node rootnode = xmldoc.getdocumentelement(); Node partnode, idnode; NodeList docnodelist = rootnode.getchildnodes(); for (int i = 0; i < docnodelist.getlength(); i++) partnode = docnodelist.item(i); idnode = partnode.getattributes().item(0); if (idnode.getnodevalue().equals(r_id)) rootnode.removechild(partnode); System.out.println("usunięto część z id=" + r_id); break; 14. Użytkownik powinien mieć dostęp do wprowadzonych do dokumentu informacji na temat części komputerowych. Ponadto powinna istnieć możliwość zapisu dokument XML do pliku. Poniżej znajduje się implementacja dwóch metod służących do realizacji tych wymagań. Dodaj te metody do klasy XMLHandler. public void showxml() Node rootnode = xmldoc.getdocumentelement(); Node mynode; Element tempelement; NodeList docnodelist = rootnode.getchildnodes(); String desc; for (int i = 0; i < docnodelist.getlength(); i++) tempelement = (Element) docnodelist.item(i); desc = "[" + tempelement.getattribute("id") + "] "; mynode = tempelement.getelementsbytagname("name").item(0); desc += mynode.getfirstchild().getnodevalue(); desc += ", price:"; mynode = tempelement.getelementsbytagname("price").item(0); desc += mynode.getfirstchild().getnodevalue(); System.out.println(desc); public void savexml() try TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newtransformer(); t.transform(new DOMSource(xmlDoc), new StreamResult( new FileOutputStream("wynik.xml"))); catch (Exception e) System.out.println(e.toString());

15. Budowana aplikacja będzie działała w trybie tekstowym. Po uruchomieniu użytkownik będzie mógł wydawać kolejne polecenia (do momentu wpisania komendy exit, co skutkuje zakończeniem działania programu). Dodaj polecenia importu pakietów i uzupełnij metodę main w klasie Shop. import java.io.*; import java.util.stringtokenizer;... public static void main(string[] args) XMLHandler xml = new XMLHandler(); xml.addroot(); try BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String input = ""; while(true) System.out.print("> "); input = in.readline(); if (input.equals("")) continue; if ("exit".equals(input)) break; else parsejob(input, xml); catch(exception e) System.out.println(e.getMessage()); 16. Dodaj metodę, która będzie realizowała polecenia wpisywane przez użytkownika. Polecenie add wymaga podania pięciu parametrów opisujących część (identyfikator, nazwa, cena, ilość w sklepie w Poznaniu, ilość w sklepie w Warszawie) oddzielonych znakiem spacji. Polecenie del wymaga podania identyfikatora usuwanej części. Polecenie show wyświetla aktualną listę części, save zapisuje dane do pliku XML. Dodaj poniższy kod do klasy Shop. public static void parsejob(string r_input, XMLHandler r_xml) StringTokenizer st = new StringTokenizer(r_input," "); String command = st.nexttoken(); if (command.equalsignorecase("add")) r_xml.addpart(st.nexttoken(), st.nexttoken(), st.nexttoken(), st.nexttoken(), st.nexttoken()); else if (command.equalsignorecase("del")) r_xml.delpart(st.nexttoken()); else if (command.equalsignorecase("show")) r_xml.showxml(); else if (command.equalsignorecase("save")) r_xml.savexml();

17. Przejdź do edycji klasy Shop. Z głównego menu wybierz Run Run. W panelu Configurations zaznacz Java Application kliknij przycisk New. 18. Uruchom aplikację przez kliknięcie przycisku Run.

19. Przetestuj działanie programu używając wbudowanej w środowisko Eclipse konsoli. Dodaj klika podzespołów do dokumentu, wyświetl je, usuń wybrane, zapisz do pliku. 20. Zapisany plik XML możesz znaleźć w katalogu projektu (przy ustawieniach użytych w ćwiczeniu, ścieżka do pliku to C:\programy\xmllab1\wynik.xml). Sprawdź zawartość pliku, np. używając przeglądarki internetowej.

Ćwiczenie 2 Celem ćwiczenia jest przygotowanie aplikacji, która umożliwi odczyt i przetwarzanie pliku z zawartością XML. Aplikacja, napisana w języku Java, będzie korzystać z parsera DOM oraz języka zapytań XPath. 1. Utwórz plik data.xml z poniższą zawartością (struktura danych w pliku jest taka jak w wynikowym pliku z ćwiczenia 1). <?xml version = '1.0' encoding = 'UTF-8'?> <computer_parts> <part ID="10"><name>procesorX</name><price>450</price> <quantity><poznan>4</poznan><warszawa>7</warszawa></quantity></part> <part ID="25"><name>mysz</name><price>65</price> <quantity><poznan>24</poznan><warszawa>56</warszawa></quantity></part> <part ID="40"><name>klawiatura</name><price>12</price> <quantity><poznan>12</poznan><warszawa>8</warszawa></quantity></part> <part ID="50"><name>monitorLCD</name><price>960</price> <quantity><poznan>5</poznan><warszawa>3</warszawa></quantity></part> <part ID="60"><name>monitorCRT</name><price>360</price> <quantity><poznan>1</poznan><warszawa>6</warszawa></quantity></part> </computer_parts> 2. Utwórz w środowisku Eclipse nowy projekt, np. o nazwie xmllab2. Sposób postępowania został opisany w krokach 1 5 poprzedniego ćwiczenia. 3. Utwórz klasę ShopBrowser w sposób, jaki pokazano w krokach 8, 9 poprzedniego ćwiczenia. Nowa klasa powinna posiadać metodę main. 4. Dodaj statyczne pole klasy typu Document, w którym przechowywany będzie odczytany dokument XML. Przykładową nazwą może być xmldoc. Nie zapomnij o zaimportowaniu odpowiednich pakietów. import org.w3c.dom.*; public class ShopBrowser private static Document m_xmldoc;

5. Podstawowym zadaniem aplikacji jest wczytanie istniejącego dokumentu XML i utworzenie odpowiadającego mu drzewa DOM. Jednym ze sposobów rozwiązania tego problemu jest wykorzystanie parsera DOM. Klasy obiektów potrzebnych do parsowania pliku znajdują się w pakiecie javax.xml.parsers. Napisz metodę dla klasy ShopBrowser, która dla zadanego przez parametr pliku, dokona transformacji tego dokumentu do drzewa DOM. Poniższy kod realizuje postawione zdanie. private static boolean readdocument(string r_filename) DocumentBuilderFactory domfactory = DocumentBuilderFactory.newInstance(); try DocumentBuilder builder = domfactory.newdocumentbuilder(); m_xmldoc = builder.parse("file:" + r_filename); return true; catch (ParserConfigurationException px) System.out.println(px.toString()); catch (Exception iox) System.out.println(iox.toString()); return false; 6. Dopisz wywołanie metody readdocument(string) w głównej metodzie klasy (metoda main). Nazwa pliku powinna być przekazywana z linii poleceń jako pierwszy argument. Kod sprawdzający dodatkowo poprawność wykonania operacji odczytu dokumentu XML znajduję się poniżej. public static void main(string[] args) if (readdocument(args[0])) System.out.println("File OK."); else System.out.println("Problem reading XML file."); System.exit(0); 7. Umieść plik XML z danymi w głównym katalogu projektu. 8. Aplikacja jest gotowa do pierwszego uruchomienia. Zauważ, że wymagane jest przekazanie parametru przy wywołaniu programu. W środowisku Eclipse zadanie to można zrealizować tworząc odpowiednią konfigurację do uruchomienia programu. Z głównego menu wybierz Run Run...

9. W oknie menadżera konfiguracji w panelu Configurations zaznacz Java Application i kliknij przycisk New.

10. Przejdź do zakładki Arguments i w polu Program arguments wpisz nazwę pliku z danymi XML. 11. Uruchom program za pomocą przycisku Run. Możesz także powtarzać uruchomienia z tymi samymi parametrami za pomocą ikony w pasku narzędziowym lub wybierając z głównego menu Run-> Run Last Lunched. Efekt działania programu widoczny jest w zakładce konsoli. 12. Kolejnym krokiem jest odczyt zawartości, skonstruowanego na podstawie pliku, drzewa DOM. Można to zrobić poruszając się po tym drzewie, tak jak zostało to pokazane w zadaniu z poprzedniego laboratorium. Inną możliwością jest zastosowanie wyrażeń XPath do wyszukiwania pożądanych węzłów. W celu użycia wyrażeń XPath z biblioteki JAXP należy utworzyć odpowiedni obiekt korzystając z fabryki XPath. Ponieważ wyrażenia będą używane wielokrotnie w ramach aplikacji, warto utworzyć osobną klasę ułatwiającą korzystanie z tych wyrażeń. Utwórz klasę XPathEvaluator.

13. Uzupełnij klasę XPathEvaluator tak, aby odpowiadała poniższemu przykładowi. package myxmlpackage; import javax.xml.xpath.*; import org.w3c.dom.document; import org.w3c.dom.nodelist; public class XPathEvaluator XPath m_xpath; public XPathEvaluator() XPathFactory factory = XPathFactory.newInstance(); m_xpath = factory.newxpath(); public NodeList selectnodes(document r_xmldoc, String r_expr) try XPathExpression expr = m_xpath.compile(r_expr); return (NodeList) expr.evaluate(r_xmldoc, XPathConstants.NODESET); catch (XPathExpressionException xpe) System.out.println(xpe.toString()); return null; 14. W klasie ShopBrowser dodaj pole klasy przechowujące obiekt klasy XPathEvaluator. Dodaj do metody main polecenie utworzenia tego obiektu. public class ShopBrowser private static XPathEvaluator m_xpe; public static void main(string[] args) m_xpe = new XPathEvaluator();

15. Zaimplementuj metodę printoverview(), która wyświetli na ekranie liczbę różnych części komputerowych oraz sumaryczną liczbę sztuk wszystkich części. Wykorzystaj klasę XPathEvaluator do znalezienia odpowiednich węzłów. Poniżej znajduje się jedna z możliwych implementacji tej metody. W rozwiązaniu zastosowano dwa wyrażenia XPath. Pierwsze z nich to //part, które znajduje wszystkie węzły part. Drugie wyrażenie ma postać //part/quantity/*/text(). Biorąc pod uwagę znaczenie informacji w źródłowym pliku XML, możne je odczytać w następujący sposób: znajdź wszystkie wartości opisujące stan magazynu dla dowolnego miasta, dla dowolnego podzespołu komputerowego. Znając te wartości można je zsumować uzyskując łączny stan zapasów w magazynach. public static void printoverview() String result = "\n"; NodeList resultnodes = m_xpe.selectnodes(m_xmldoc, "//part"); if (resultnodes!= null) result += "Number of parts: " + resultnodes.getlength() + "\n"; resultnodes = m_xpe.selectnodes(m_xmldoc, "//part/quantity/*/text()"); int counter = 0; for (int i = 0; i < resultnodes.getlength(); i++) counter += Integer.parseInt(resultNodes.item(i).getNodeValue()); result += "Total number of items: " + counter + "\n"; System.out.println(result); 16. Dodaj wywołanie metody printoverview() na końcu metody main. Uruchom program i sprawdź efekt jego wykonania.

17. Następnym krokiem będzie implementacja metody wyszukującej podzespoły o zadanych parametrach, którymi będą: maksymalna cena podzespołu i minimalna liczba sztuk tego podzespołu w mieście Poznań. Zaimplementuj metodę w klasie ShopBrowser, np. o nazwie searchparts1, która będzie wykorzystywała tylko metody do poruszania się po drzewie oferowane przez DOM API. Przykładowa implementacja znajduje się poniżej. public static void searchparts1(string r_maxprice, String r_minquantity) Element rootnode = (Element) m_xmldoc.getdocumentelement(); NodeList partnodes = rootnode.getelementsbytagname("part"); for (int i = 0; i < partnodes.getlength(); i++) Element partelement = (Element) partnodes.item(i); Node pricenode = partelement.getelementsbytagname("price").item(0); int price = Integer.parseInt(priceNode.getFirstChild().getNodeValue()); if (price <= Integer.parseInt(r_maxPrice)) Element quantityelement = (Element) partelement.getelementsbytagname("quantity").item(0); Node citynode = quantityelement.getelementsbytagname("poznan").item(0); int q = Integer.parseInt(cityNode.getFirstChild().getNodeValue()); if (q >= Integer.parseInt(r_minQuantity)) Node namenode = partelement.getelementsbytagname("name").item(0); System.out.println(nameNode.getFirstChild().getNodeValue()); 18. Zaimplementuj metodę searchparts2, która będzie wykonywała te same czynności jak metoda searchparts1, ale z wykorzystaniem języka XPath. Przykładowa implementacja tej metody znajduje się poniżej. Wykorzystano w niej wyrażenie XPath w postaci //part[price<=x]/quantity[poznan>=y], gdzie x i y to parametry. public static void searchparts2(string r_maxprice, String r_minquantity) String expr = "//part[price<=" + r_maxprice + "]/quantity[poznan>=" + r_minquantity + "]"; NodeList resultnodes = m_xpe.selectnodes(m_xmldoc, expr); if (resultnodes!= null) for (int i = 0; i < resultnodes.getlength(); i++) Element partelement = (Element)resultNodes.item(i).getParentNode(); Node name = partelement.getelementsbytagname("name").item(0); System.out.println(name.getFirstChild().getNodeValue());

19. Dodaj do metody main wywołania obu funkcji. Dobierz odpowiednie parametry na podstawie zawartości pliku XML tak, aby uzyskać sensowne wyniki. Ostatecznie metoda main powinna mieć zawartość zbliżoną do następującej. public static void main(string[] args) if (readdocument(args[0])) System.out.println("File OK."); else System.out.println("Problem reading XML file."); System.exit(0); m_xpe = new XPathEvaluator(); System.out.println("-----------------------"); printoverview(); System.out.println("-----------------------"); searchparts1("600", "4"); System.out.println("-----------------------"); searchparts2("600", "4"); 20. Uruchom aplikację i sprawdź efekt jej działania.