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://javapraca.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