JavaRush /Java Blog /Random-IT /XML in Java: che cos'è?

XML in Java: che cos'è?

Pubblicato nel gruppo Random-IT
Ciao! Oggi faremo conoscenza con un altro formato dati chiamato XML. Questo è un argomento molto importante. Quando lavori su applicazioni Java reali, quasi sicuramente incontrerai problemi relativi a XML. Questo formato è utilizzato quasi ovunque nello sviluppo Java (scopriremo perché esattamente di seguito), quindi ti consiglio di leggere la lezione non "in diagonale", ma di comprendere tutto a fondo e allo stesso tempo studiare ulteriore letteratura/link :) Questo il tempo non sarà sicuramente sprecato. Quindi, iniziamo con quelli semplici: "cosa" e "perché"!

Cos'è l'XML?

XML sta per eXtensible Markup Language. Potresti già avere familiarità con uno dei linguaggi di markup: hai sentito parlare di HTML, che viene utilizzato per creare pagine web :) Cos'è XML - 1HTML e XML sono anche simili nell'aspetto:
HTML1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML1
<headline>title</headline>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
HTML2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML2
<chief>title</chief>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
In altre parole, XML è un linguaggio per descrivere i dati.

Perché è necessario XML?

XML è stato originariamente inventato per l'archiviazione e la trasmissione più convenienti dei dati, anche su Internet. Presenta una serie di vantaggi che gli consentono di affrontare con successo questo compito. Innanzitutto, è facile da leggere sia per gli esseri umani che per i computer. Penso che tu possa facilmente capire cosa descrive questo file xml:
<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Anche il computer comprende facilmente questo formato. In secondo luogo, poiché i dati vengono archiviati in un semplice formato di testo, non ci saranno problemi di compatibilità durante il trasferimento da un computer all'altro. È importante capire che XML non è un codice eseguibile, ma un linguaggio di descrizione dei dati . Dopo aver descritto i dati utilizzando XML, è necessario scrivere il codice (ad esempio, in Java) in grado di inviare/ricevere/elaborare questi dati.

Come funziona l'XML?

Il suo componente principale sono i tag: queste sono le cose tra parentesi angolari:
<book>
</book>
Ci sono tag di apertura e di chiusura. Quello di chiusura ha un simbolo aggiuntivo - " /", come si può vedere nell'esempio sopra. Ogni tag di apertura deve avere un tag di chiusura corrispondente. Mostrano dove inizia e finisce la descrizione di ciascun elemento nel file. I tag possono essere annidati! Nel nostro esempio di libro, il tag <book> ha 3 sottotag: <title> , <author> e <year> . Questo non è limitato a un livello: i sottotag possono avere i propri sottotag, ecc. Questo disegno è chiamato albero dei tag. Diamo un'occhiata all'albero usando l'esempio di un file XML con la descrizione di una concessionaria di automobili:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Qui abbiamo un tag di livello superiore - <carstore> . È anche chiamato "root" - tag root. <carstore> ha un tag figlio, <car>. <car>, a sua volta, ha anche 3 tag secondari: <model>, <year> e <price>. Ogni tag può avere attributi: informazioni importanti aggiuntive. Nel nostro esempio, il tag <model> ha un attributo "lang" - la lingua in cui è scritto il nome del modello:
<model lang="en">Scania R 770</model>
In questo modo possiamo indicare che il titolo è scritto in inglese. Il nostro tag <price> ha un attributo "currency".
<price currency="US dollar">150000.00</price>
In questo modo possiamo indicare che il prezzo dell'auto è in dollari USA. Pertanto, XML ha una sintassi "autodescrittiva" . È possibile aggiungere qualsiasi informazione necessaria per descrivere i dati. Puoi anche aggiungere una riga all'inizio del file che indica la versione XML e la codifica in cui sono scritti i dati. Si chiama " prolog " e assomiglia a questo:
<?xml version="1.0" encoding="UTF-8"?>
Utilizziamo la versione XML 1.0 e la codifica UTF-8. Questo non è necessario, ma può essere utile se, ad esempio, utilizzi testo in diverse lingue nel tuo file. Abbiamo menzionato che XML sta per “extensible markup Language”, ma cosa significa “extensible”? Ciò significa che è perfettamente adatto per creare nuove versioni dei tuoi oggetti e file. Vogliamo, ad esempio, che il nostro autosalone inizi a vendere anche le motociclette! Allo stesso tempo, nel programma dobbiamo supportare entrambe le versioni di <carstore>: sia quella vecchia (senza motociclette) che quella nuova. Ecco la nostra vecchia versione:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Ed ecco quello nuovo, ampliato:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
Abbiamo aggiunto così facilmente e semplicemente la descrizione delle motociclette al nostro file :) Allo stesso tempo, non abbiamo assolutamente bisogno di impostare gli stessi tag secondari per le motociclette e per le auto. Tieni presente che le motociclette, a differenza delle automobili, hanno un elemento <owner>: il proprietario. Ciò non impedirà a un computer (e nemmeno a una persona) di leggere i dati.

Differenze tra XML e HTML

Abbiamo già detto che XML e HTML hanno un aspetto molto simile. Pertanto, è molto importante sapere in cosa differiscono. Innanzitutto, vengono utilizzati per scopi diversi. HTML: per contrassegnare le pagine Web. Ad esempio, se devi creare un sito web, utilizzando HTML puoi specificare: “Il menu dovrebbe essere nell'angolo in alto a destra. Dovrebbe avere questi e quei pulsanti. In altre parole, lo scopo dell'HTML è visualizzare i dati. XML: per archiviare e trasmettere informazioni in una forma conveniente per esseri umani e computer. Questo formato non contiene istruzioni su come devono essere visualizzati questi dati: dipende dal codice del programma stesso. In secondo luogo, hanno una differenza tecnica principale. I tag HTML sono predefiniti. In altre parole, per creare un'intestazione (ad esempio, una grande iscrizione all'inizio della pagina), in HTML vengono utilizzati solo i tag <h1></h1> (per intestazioni più piccole - <h2></h2>, < h3></h3>). Non potrai creare intestazioni in HTML utilizzando tag con titoli diversi. XML non utilizza tag predefiniti. Puoi dare ai tag tutti i nomi che desideri: <header>, <title>, <idontknow2121>.

Risoluzione del conflitto

La libertà offerta da XML può anche portare ad alcuni problemi. Ad esempio, la stessa entità (ad esempio un'auto) può essere utilizzata da un programma per scopi diversi. Ad esempio, abbiamo un file XML che descrive le macchine. Tuttavia, i nostri programmatori non erano d'accordo tra loro in anticipo. E ora, oltre ai dati delle auto vere, il nostro xml include anche i dati dei modelli giocattolo! Inoltre, hanno gli stessi attributi. Il nostro programma riceve il seguente file XML. Come possiamo distinguere un'auto vera da un modello giocattolo?
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
I prefissi e gli spazi dei nomi ci aiuteranno qui. Per separare le macchinine da quelle vere nel nostro programma (e, in generale, qualsiasi oggetto giocattolo dai loro prototipi reali), introduciamo due prefissi: "reale" e "giocattolo".
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
Ora il nostro programma sarà in grado di distinguere tra entità! Qualunque cosa con il prefisso toy verrà classificata come giocattoli :) Tuttavia, non abbiamo ancora finito. Per utilizzare i prefissi, dobbiamo registrarli ciascuno come spazio dei nomi. Beh, in realtà, "registrarsi" è una parola forte :) Devi solo trovare un nome univoco per ognuno di essi. È come con le classi: una classe ha un nome breve ( Cat) e un nome completo con tutti i pacchetti ( zoo.animals.Cat) Per creare spazi dei nomi univoci, solitamente viene utilizzato un URI . A volte l'indirizzo Internet viene sostituito qui, dove le funzioni e lo scopo di questo spazio dei nomi sono descritti in dettaglio. Ma questo non deve essere un indirizzo Internet valido. Molto spesso i progetti utilizzano semplicemente stringhe simili a URI che aiutano a tenere traccia della gerarchia degli spazi dei nomi. Ecco un esempio:
<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
Naturalmente non esiste un sito su Internet all'indirizzo http://testproject.developersgroup1.companyname/department2/namespaces/real Ma ci sono informazioni utili: il gruppo di sviluppatori "developersgroup1" del dipartimento "department2" è responsabile della creazione lo spazio dei nomi “reale”. Se hai bisogno di aggiungere nuovi nomi o discutere di possibili conflitti con loro, sappiamo a chi rivolgerci. A volte un vero indirizzo Internet con una descrizione di questo spazio dei nomi viene utilizzato come nome univoco per uno spazio dei nomi. Ad esempio, se si tratta di una grande azienda e il suo progetto sarà utilizzato da milioni di persone in tutto il mondo. Ma questo non sempre viene fatto: c'è una discussione di questo problema su Stackoverflow . In linea di principio, il requisito di utilizzare gli URI come nomi per i namespace non è rigoroso: puoi semplicemente utilizzare stringhe casuali. Funzionerà anche questa opzione:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Ma ci sono una serie di vantaggi nell’usare gli URI. Puoi leggere di più a riguardo qui .

Standard XML fondamentali

Gli standard XML sono un insieme di estensioni che aggiungono funzionalità aggiuntive ai file xml. XML ha molti standard, ma esamineremo solo quelli più importanti e scopriremo cosa consentono di fare AJAX , uno degli standard XML più famosi. Ti consente di modificare il contenuto di una pagina web senza ricaricarla! Figo? :) Puoi provare questa tecnologia di persona qui . XSLT : consente di convertire il testo XML in altri formati. Ad esempio, utilizzando XSLT, puoi trasformare XML in HTML! Lo scopo di XML, come abbiamo già detto, è descrivere i dati, non visualizzarli. Ma utilizzando XSLT possiamo aggirare questa limitazione! Ecco un sandbox con un esempio funzionante, dove puoi vedere tu stesso come funziona :) XML DOM : ti consente di ottenere, modificare, aggiungere o rimuovere singoli elementi da un file XML. Ecco un piccolo esempio di come funziona. Abbiamo un file books.xml:
<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
Ci sono due libri dentro. I libri hanno un elemento come il titolo - <title>. E qui possiamo usare JavaScript per ottenere tutti i titoli dei libri dal nostro file XML e inviare il primo di essi alla console:
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
Ancora una volta, ti consiglio di vedere come funziona questo esempio utilizzando una sandbox :) DTD ("definizione del tipo di documento"): ti consente di definire un elenco di elementi consentiti per alcune entità in un file XML. Ad esempio, stiamo lavorando al sito web di una libreria e tutti i team di sviluppo hanno concordato che per l'elemento libro, nei file XML dovrebbero essere specificati solo gli attributi titolo, autore e anno. Ma come possiamo proteggerci dalla disattenzione? Molto facile!
<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
Qui abbiamo definito un elenco di attributi validi per <book>. Prova ad aggiungere un nuovo elemento lì e riceverai immediatamente un errore!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Errore! "L'elemento mainhero non è consentito qui" Esistono molti altri standard XML. Puoi familiarizzare con ciascuno di essi e provare a scavare più a fondo nel codice sul sito Web WC3 (sezione "Importanti standard XML"). E in generale, se hai bisogno di informazioni su XML, puoi trovare quasi tutto lì :) Bene, la nostra lezione è giunta al termine. È ora di tornare ai compiti! :) Ci vediamo!
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION