CodeGym /Java Blog /Random-IT /XML in Java
John Squirrels
Livello 41
San Francisco

XML in Java

Pubblicato nel gruppo Random-IT
CIAO! Oggi introdurremo un altro formato di dati chiamato XML. Questo è un argomento molto importante. Quando si lavora su applicazioni Java reali, quasi sicuramente si incontrano attività relative a XML. Nello sviluppo Java, questo formato è usato quasi universalmente (scopriremo perché più avanti), quindi ti consiglio di non rivedere superficialmente questa lezione, ma piuttosto di acquisire una comprensione approfondita di tutto e di studiare anche letteratura/link aggiuntivi :) Questo sicuramente non sarà una perdita di tempo. Quindi, iniziamo con le cose facili: il "cosa" e il "perché"!

Cos'è l'XML di Java?

XML sta per eXtensible Markup Language. Potresti già avere familiarità con un linguaggio di markup: hai sentito parlare di HTML, che viene utilizzato per creare pagine web :) Cos'è l'XML?  - 1HTML e XML hanno anche un aspetto simile:
HTML 1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2

<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é hai bisogno di XML?

XML è stato originariamente inventato per archiviare e inviare dati in modo più conveniente, anche tramite Internet. Ha diversi vantaggi che ti aiutano a raggiungere questo obiettivo. Innanzitutto, è facile da leggere sia da un essere umano che da un 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 un computer comprende facilmente questo formato. In secondo luogo, poiché i dati vengono archiviati come testo normale, non ci saranno problemi di compatibilità quando li trasferiamo da un computer all'altro. È importante capire che XML non è un codice eseguibile, è un linguaggio di descrizione dei dati. Dopo aver descritto i dati utilizzando XML, è necessario scrivere codice (ad esempio, in Java) in grado di inviare/ricevere/elaborare questi dati.

Come è strutturato XML?

Il componente principale sono i tag: queste sono le cose tra parentesi angolari:

<book>
</book>
Ci sono tag di apertura e tag di chiusura. Il tag di chiusura ha un simbolo aggiuntivo (" / "), come si può vedere nell'esempio sopra. Ogni tag di apertura deve avere un tag di chiusura. Mostrano dove inizia e finisce la descrizione di ciascun elemento nel file. I tag possono essere nidificati! Nel nostro esempio di libro, il tag <book> ha 3 tag nidificati: <title>, <author> e <year>. Questo non è limitato a un livello di nidificazione: i tag nidificati possono avere i propri tag nidificati, ecc. Questa struttura è chiamata albero dei tag. Diamo un'occhiata a questo albero utilizzando un file XML di esempio che descrive 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 primo livello: <carstore>. È anche chiamato elemento radice. <carstore> ha un tag figlio: <car>. <car>, a sua volta, ha anche 3 tag figli: <model>, <year> e <price>. Ogni tag può avere attributi, che contengono ulteriori informazioni importanti. Nel nostro esempio, il tag <model> ha un attributo "lang", che indica la lingua utilizzata per registrare il nome del modello:

<model lang="en">Scania R 770</model>
Qui indichiamo che il nome è scritto in inglese. Il nostro tag <price> ha un attributo "currency".

<price currency="US dollar">150000.00</price>
Qui indichiamo che il prezzo dell'auto è espresso in dollari USA. Pertanto, XML ha una sintassi "autodescrittiva". È possibile aggiungere qualsiasi informazione necessaria per descrivere i dati. Inoltre, nella parte superiore del file è possibile aggiungere una riga che indica la versione XML e la codifica utilizzata per scrivere i dati. Questo è chiamato "prologo" e assomiglia a questo:

<?xml version="1.0" encoding="UTF-8"?>
Stiamo usando la versione XML 1.0 e la codifica UTF-8. Questo non è necessario, ma può tornare utile se, ad esempio, il tuo file utilizza testo in lingue diverse. Abbiamo detto che XML significa "eXtensible Markup Language", ma cosa significa "estensibile"? Ciò significa che è perfetto per creare nuove versioni dei tuoi oggetti e file. Ad esempio, supponiamo di voler iniziare a vendere anche moto presso la nostra concessionaria di auto! Detto questo, abbiamo bisogno che il nostro programma supporti entrambe le versioni di <carstore>: quella vecchia (senza motociclette) e 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 il 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>
È così facile e semplice aggiungere una descrizione delle motociclette al nostro file :) Inoltre, non abbiamo assolutamente bisogno di avere gli stessi tag figlio per le motociclette e per le auto. Tieni presente che le motociclette, a differenza delle automobili, hanno un elemento <owner>. Ciò non impedisce al computer (o all'essere umano) di leggere i dati.

Differenze tra XML e HTML

Abbiamo già detto che XML e HTML sono molto simili nell'aspetto. Ciò rende molto importante sapere in che modo differiscono. Innanzitutto, vengono utilizzati per scopi diversi. L'HTML serve per marcare le pagine web. Ad esempio, durante la creazione di un sito Web, è possibile utilizzare l'HTML per specificare: "Il menu dovrebbe essere nell'angolo in alto a destra. Dovrebbe avere tali e tali pulsanti". In altre parole, il compito dell'HTML è visualizzare i dati. XML serve per archiviare e inviare informazioni in una forma conveniente per umani e computer. Questo formato non contiene alcuna indicazione su come questi dati debbano essere visualizzati: ciò dipende dal codice del programma che li legge. In secondo luogo, c'è una grande differenza tecnica. I tag HTML sono predefiniti. In altre parole, la creazione di un'intestazione HTML (ad esempio, una grande didascalia nella parte superiore della pagina) utilizza solo <h1></h1> tag (<h2></h2> e <h3></h3> sono usati per intestazioni più piccole). Non puoi creare intestazioni HTML utilizzando altri tag. XML non utilizza tag predefiniti. Puoi dare ai tag qualsiasi nome tu voglia: <header>, <title>, <idotknow2121>.

Risoluzione del conflitto

La libertà offerta da XML può 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 automobili. Tuttavia, i nostri programmatori non hanno raggiunto un accordo preventivo tra di loro. E ora, oltre ai dati sulle auto reali, potremmo trovare dati sulle macchinine nel nostro XML! Inoltre, hanno gli stessi attributi. Supponiamo che il nostro programma legga un tale file XML. Come distinguiamo un'auto vera da una macchinina?

<?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>
Qui i prefissi e lo spazio dei nomi ci aiuteranno. Per distinguere le macchinine da quelle vere nel nostro programma (e in effetti qualsiasi giocattolo dalle loro controparti 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 le diverse entità! Tutto ciò che ha il prefisso giocattolo verrà trattato come un giocattolo :) Tuttavia, non abbiamo ancora finito. Per utilizzare i prefissi, dobbiamo registrare ciascuno di essi come spazio dei nomi. In realtà, "registrarsi" è una parola forte :) Dobbiamo semplicemente trovare un nome univoco per ciascuno di essi. È come con le classi: una classe ha un nome breve ( Cat ) e un nome completo che include tutti i pacchetti ( zoo.animals.Cat). Un URI viene solitamente utilizzato per creare un nome di spazio dei nomi univoco. A volte questo viene fatto utilizzando un indirizzo Internet, dove sono descritte le funzioni di questo spazio dei nomi. Ma non deve essere un indirizzo Internet valido. Molto spesso, i progetti utilizzano semplicemente stringhe simili a URI che aiutano a tenere traccia della gerarchia dello spazio 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 Web all'indirizzo "http://testproject.developersgroup1.companyname/department2/namespaces/real" Ma questa stringa contiene informazioni utili: gli sviluppatori del Gruppo 1 nel Dipartimento 2 sono responsabili della creazione dello spazio dei nomi "reale" . Se dobbiamo introdurre nuovi nomi o discutere di possibili conflitti, sapremo a chi rivolgerci. A volte gli sviluppatori utilizzano un vero indirizzo web descrittivo come nome univoco dello spazio dei nomi. Ad esempio, questo potrebbe essere il caso di una grande azienda il cui progetto verrà utilizzato da milioni di persone in tutto il mondo. Ma questo non è certamente sempre fatto: Stack Overflow ha una discussione su questo tema. In generale, non esiste un requisito rigoroso per utilizzare gli URI come nomi degli spazi dei nomi: puoi anche semplicemente utilizzare stringhe casuali. Questa opzione funzionerebbe anche:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Detto questo, l'utilizzo di un URI ha diversi vantaggi. Puoi leggere di più su questo proprio qui .

Standard XML di base

Gli standard XML sono un insieme di estensioni che aggiungono funzionalità extra ai file XML. XML ha molti standard, ma esamineremo solo i più importanti e scopriremo che rendono possibile AJAX, che è uno degli standard XML più famosi. Ti consente di modificare i contenuti di una pagina Web senza ricaricarla! XSLT ti consente di convertire il testo XML in altri formati. Ad esempio, puoi utilizzare XSLT per convertire XML in HTML! Come abbiamo detto, lo scopo di XML è descrivere i dati, non visualizzarli. Ma con XSLT possiamo aggirare questa limitazione! XML DOM consente di recuperare, modificare, aggiungere o eliminare 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>
Ha due libri. I libri hanno un elemento <title>. Qui possiamo utilizzare JavaScript per ottenere tutti i titoli dei libri dal nostro file XML e stampare il primo sulla 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>
DTD ("definizione del tipo di documento") consente di definire un elenco di elementi consentiti per un'entità in un file XML. Ad esempio, supponiamo che stiamo lavorando su un sito Web di una libreria e che tutti i team di sviluppo concordino sul fatto che solo gli attributi titolo, autore e anno debbano essere specificati per gli elementi del libro nei file XML. Ma come ci proteggiamo 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 otterrai 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. Ad ogni modo, se hai bisogno di informazioni su XML, puoi trovare quasi tutto lì :) E con questo, la nostra lezione volge al termine. È ora di tornare ai compiti! :) Fino alla prossima volta!
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION