Język XML w Javie
Język XML (ang. Extensible Markup Language) pozwala w strukturalizowany sposób przechowywać dane. Wywodzi się z języka SGML Jego główną zaletą jest niezależność od platformy (jedno z założeń Javy), co ułatwia wymianę danych pomiędzy różnymi systemami zarówno przez sieć internet jak i lokalnie.
Struktura dokumentu XML
Dokument XML powinien rozpoczynać się od deklaracji, która wygląda następująco.
<?xml version=”1.0″ encoding=”UTF-8″?>
Odpowiednio znajdują się informacje na temat wersji języka XML oraz sposobu kodowania znaków w dokumencie.
Następnie może znajdować się sekcja kontrolująca zawartość pliku XML. Prostszą jej wersją jest definicja typu dokumentu (DTD). Natomiast o wiele bardziej złożoną wersją, ale dającą większe możliwości jest język XML Schema.
Definicje typów dokumentu
Ta sekcja może znajdować się bezpośrednio w pliku XML, jednakże lepszym rozwiązaniem jest umieszczenie odnośnika. Poniżej znajduje się przykład takiego odwołania.
<!DOCTYPE product SYSTEM „https://programistajava.pl/produkt.dtd”>
Zgodnie z nazwą pliku postaramy się opisać produkt w sklepie odzieżowym przy pomocy pliku XML.
1 2 3 4 5 6 7 |
<!ELEMENT produkty (produkt+)> <!ELEMENT produkt (nazwa, opis?, cena, rozmiar, kolor)> <!ELEMENT nazwa (#PCDATA)> <!ELEMENT opis (#PCDATA)> <!ELEMENT cena (#PCDATA)> <!ELEMENT rozmiar (#PCDATA)> <!ELEMENT kolor (#PCDATA)> |
Głównym węzłem zgodnym z powyższym plikiem DTD będą produkty. Będą się składać z co najmniej jednego elementu produkt. On z kolei składa się z elementów takich jak nazwa, opis, cena, rozmiar oraz kolor. Każdy z elementów można zapisać przy pomocy zwykłego tekstu. Poniżej opiszemy w jaki sposób można definiować DTD.
Znacznik | Opis |
---|---|
Element* | 0 lub więcej wystąpień elementu |
Element+ | Co najmniej jedno wystąpienie elementu |
Element? | 0 lub 1 wystąpienie elementu |
Element1, Element2 | Kolejno występujące po sobie elementy |
Element1 | Element2 | Jeden z elementów |
#PCDATA | Zwykły tekst |
W dalszej części możemy już znaleźć przechowywane w dokumencie dane. Do powyższego opisu poprawny jest poniższa zawartość XML.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE produkty[ <!ELEMENT produkty (produkt+)> <!ELEMENT produkt (nazwa, opis?, cena, rozmiar, kolor)> <!ELEMENT nazwa (#PCDATA)> <!ELEMENT opis (#PCDATA)> <!ELEMENT cena (#PCDATA)> <!ELEMENT rozmiar (#PCDATA)> <!ELEMENT kolor (#PCDATA)> ]> <produkty> <produkt> <nazwa>koszula</nazwa> <opis>Męska koszula w kolorze białym.</opis> <cena>100</cena> <rozmiar>M</rozmiar> <kolor>Biały</kolor> </produkt> <produkt> <nazwa>Kopertowa sukienka</nazwa> <opis>Piękna kopertowa sukienka w kolorze błękitnym.</opis> <cena>250</cena> <rozmiar>XS</rozmiar> <kolor>Błękitny</kolor> </produkt> </produkty> |
Wczytanie zawartości pliku XML
Przy pomocy poniższego kodu można wczytać zawartość pliku XML.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package pl.programistajava.files; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.*; import org.xml.sax.SAXException; public class ReadXML { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { String fileName = "D:\\products.xml"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(fileName); Element root = doc.getDocumentElement(); System.out.println(root.getTagName()); NodeList productsList = root.getElementsByTagName("produkt"); for(int i=0; i < productsList.getLength(); i++ ) { Node node = productsList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element product = (Element) node; System.out.println("nazwa: "+ product.getElementsByTagName("nazwa").item(0).getTextContent()); System.out.println("opis: "+ product.getElementsByTagName("opis").item(0).getTextContent()); System.out.println("cena: "+ product.getElementsByTagName("cena").item(0).getTextContent()); System.out.println("rozmiar: "+ product.getElementsByTagName("rozmiar").item(0).getTextContent()); System.out.println("kolor: "+ product.getElementsByTagName("kolor").item(0).getTextContent()); } } } } |
Wynik uruchomienia powyższego kodu widoczny jest poniżej
produkty
nazwa: koszula
opis: Męska koszula w kolorze białym.
cena: 100
rozmiar: M
kolor: Biały
nazwa: Kopertowa sukienka
opis: Piękna kopertowa sukienka w kolorze błękitnym.
cena: 250
rozmiar: XS
kolor: Błękitny