JavaRush /Java Blog /Random-IT /Nozioni di base su XML per programmatori Java - Parte 1 d...
Ярослав
Livello 40
Днепр

Nozioni di base su XML per programmatori Java - Parte 1 di 3

Pubblicato nel gruppo Random-IT
XML è un formato molto popolare e flessibile al giorno d'oggi. Ogni programmatore dovrebbe capirlo, è semplicemente un must. Molte tecnologie oggi lo utilizzano attivamente e quelle moderne sono tra queste.
Nozioni di base su XML per programmatori Java - Parte 1 di 3 - 1

introduzione

Ciao, cari lettori del mio articolo. Voglio dire subito che questo è solo il primo articolo della mia serie di tre articoli. L'obiettivo principale dell'intera serie è avviare ogni lettore all'XML e fornire, se non una spiegazione e comprensione completa, almeno una buona spinta verso di esso, spiegando i punti e le cose principali. L'intero ciclo sarà per una nomination - "Attenzione ai dettagli" e la divisione in 3 articoli è fatta per rientrare nel limite di caratteri nei post e dividere una grande quantità di materiale in porzioni più piccole per una maggiore comprensione. Il primo articolo sarà dedicato all'XML stesso e a cosa è, nonché a uno dei modi per creare uno schema per i file XML: DTD. Per cominciare vorrei fare una piccola prefazione per chi non ha ancora dimestichezza con XML: non c'è bisogno di spaventarsi. XML non è molto complicato e dovrebbe essere compreso da qualsiasi programmatore, poiché oggi è un formato di file molto flessibile, efficiente e popolare per archiviare una varietà di informazioni desiderate. XML è utilizzato in Ant, Maven, Spring. Qualsiasi programmatore ha bisogno della conoscenza di XML. Ora che hai raccolto la forza e la motivazione, iniziamo a studiare. Cercherò di esporre tutto il materiale nel modo più semplice possibile, raccogliendo solo i più importanti e senza dilungarmi tra le erbacce.

XML

Per una spiegazione più chiara sarebbe meglio visualizzare l'XML con un esempio.
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee>
                    <name>Maksim</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Ivan</name>
                    <job>Junior Software Developer</job>
                </employee>
                <employee>
                    <name>Franklin</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee>
                    <name>Herald</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Adam</name>
                    <job>Middle Software Developer</job>
                </employee>
                <employee>
                    <name>Leroy</name>
                    <job>Junior Software Developer</job>
                </employee>
            </employees>
        </office>
    </offices>
</company>
HTML e XML sono simili nella sintassi perché hanno un genitore comune: SGML. Tuttavia, in HTML ci sono solo tag fissi di uno standard specifico, mentre in XML puoi creare i tuoi tag, attributi e, in generale, fare quello che vuoi per archiviare i dati nel modo che preferisci. Infatti, i file XML possono essere letti da chiunque conosca l'inglese. Questo esempio può essere rappresentato utilizzando un albero. Nozioni di base su XML per programmatori Java - Parte 1 di 3 - 2La radice dell'albero è Compagnia. È anche l'elemento radice (radice) da cui provengono tutti gli altri elementi. Ogni file XML può avere solo un elemento root. Deve essere dichiarato dopo la dichiarazione del file xml (la prima riga nell'esempio) e contenere tutti gli altri elementi. Un po' di dichiarazione: è obbligatoria ed è necessaria per identificare il documento come XML. Ha tre pseudo-attributi (attributi speciali predefiniti): versione (secondo lo standard 1.0), encoding (codifica) e standalone (autonomia: se sì e schemi esterni sono collegati al documento, allora si verificherà un errore, l'impostazione predefinita è no). Gli elementi sono entità che memorizzano dati utilizzando altri elementi e attributi. Gli attributi sono informazioni aggiuntive su un elemento specificato quando si aggiunge un elemento. Se traduciamo la spiegazione in un campo OOP, possiamo fornire il seguente esempio: abbiamo un'auto, ogni auto ha caratteristiche (colore, capacità, marca, ecc.) - questi sono attributi e ci sono entità che si trovano all'interno dell'auto : porte, finestrini, motore, volante sono altri elementi. Puoi memorizzare le proprietà come singoli elementi o come attributi, a seconda delle tue esigenze. Dopotutto, XML è un formato estremamente flessibile per archiviare informazioni su qualsiasi cosa. Dopo le spiegazioni, dobbiamo solo guardare l'esempio sopra perché tutto vada a posto. Nell'esempio abbiamo descritto una struttura aziendale semplice: c'è un'azienda che ha un nome e degli uffici, e negli uffici ci sono i dipendenti. Gli elementi Employees e Offices sono elementi wrapper: servono a raccogliere elementi dello stesso tipo, essenzialmente combinandoli in un unico set per facilitare l'elaborazione. Il pavimento e la stanza meritano un'attenzione speciale. Questi sono gli attributi dell'ufficio (piano e numero), in altre parole, le sue proprietà. Se avessimo un elemento “immagine”, potremmo trasferirne le dimensioni. Potresti notare che l'azienda non ha un attributo name, ma ha un elemento name. Puoi semplicemente descrivere le strutture nel modo desiderato. Nessuno ti obbliga a scrivere tutte le proprietà degli elementi solo negli attributi; puoi usare solo gli elementi e scrivere dei dati al loro interno. Ad esempio, possiamo registrare il nome e la posizione dei nostri dipendenti come attributi:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer">

                </employee>
                <employee name="Ivan" job="Junior Software Developer">

                </employee>
                <employee name="Franklin" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer">

                </employee>
                <employee name="Adam" job="Middle Software Developer">

                </employee>
                <employee name="Leroy" job="Junior Software Developer">

                </employee>
            </employees>
        </office>
    </offices>
</company>
Come puoi vedere, ora il nome e la posizione di ciascun dipendente sono i suoi attributi. E puoi notare che non c'è nulla all'interno dell'entità Employee (tag), tutti gli elementi Employee sono vuoti. Quindi puoi rendere dipendente un elemento vuoto: chiudilo immediatamente dopo aver dichiarato gli attributi. Questo è fatto in modo abbastanza semplice, basta aggiungere una barra:
<?xml version="1.0" encoding="UTF-8"?>
<company>
    <name>IT-Heaven</name>
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="Maksim" job="Middle Software Developer" />
                <employee name="Ivan" job="Junior Software Developer" />
                <employee name="Franklin" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
Come puoi vedere, chiudendo gli elementi vuoti, abbiamo preservato l'intera integrità delle informazioni e abbreviato notevolmente la registrazione, rendendo le informazioni più concise e leggibili. Per aggiungere un commento (testo che verrà saltato durante l'analisi di un file) in XML, esiste la seguente sintassi:
<!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
E l'ultima costruzione è CDATA , che significa "dati dei caratteri". Grazie a questo design è possibile scrivere testo che non verrà interpretato come markup XML. Ciò è utile se è presente un'entità all'interno del file XML che memorizza il markup XML nelle informazioni. Esempio:
<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
Il bello di XML è che puoi estenderlo come vuoi: usa i tuoi elementi, i tuoi attributi e strutturalo come desideri. È possibile utilizzare sia attributi che elementi per memorizzare dati (come mostrato nell'esempio precedente). Tuttavia, devi capire che puoi inventare i tuoi elementi e attributi al volo e come preferisci, ma cosa succede se lavori su un progetto in cui un altro programmatore vuole spostare l'elemento nome negli attributi e l'intera logica del programma? è scritto in modo che il nome fosse un elemento? Come puoi creare le tue regole su quali elementi dovrebbero essere, quali attributi hanno e altre cose, in modo da poter convalidare i file XML ed essere sicuro che le regole diventeranno standard nel tuo progetto e nessuno le violerà? Per scrivere tutte le regole del tuo markup XML, ci sono strumenti speciali. I più famosi: DTD e XML Schema. In questo articolo parleremo solo del primo.

DTD

DTD viene creato per descrivere tipi di documenti. DTD sta già diventando obsoleto e ora viene attivamente abbandonato in XML, ma ci sono ancora molti file XML che utilizzano DTD e, in generale, è utile capirlo. DTD è una tecnologia per la convalida dei documenti XML . Una DTD dichiara regole specifiche per un tipo di documento: i suoi elementi, quali elementi possono essere all'interno dell'elemento, gli attributi, se sono richiesti o meno, il numero delle loro ripetizioni, così come le Entità. Similmente all'XML, un DTD può essere visualizzato con un esempio per una spiegazione più chiara.
<!-- Объявление возможных элементов -->
<!ELEMENT employee EMPTY>
<!ELEMENT employees (employee+)>
<!ELEMENT office (employees)>
<!ELEMENT offices (office+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT company (name, offices)>

<!-- Добавление атрибутов для элементов employee и office -->
<!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
>

<!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
>

<!-- Добавление сущностей -->
<!ENTITY M "Maksim">
<!ENTITY I "Ivan">
<!ENTITY F "Franklin">
Qui abbiamo un esempio così semplice. In questo esempio, abbiamo dichiarato la nostra intera gerarchia dall'esempio XML: dipendente, dipendenti, ufficio, uffici, nome, azienda. Per creare file DTD, ci sono 3 costruzioni principali utilizzate per descrivere qualsiasi file XML: ELEMENT (per descrivere gli elementi), ATTLIST (per descrivere gli attributi degli elementi) ed ENTITY (per sostituire il testo con forme abbreviate). ELEMENTO Utilizzato per descrivere un elemento. Gli elementi che possono essere utilizzati all'interno di un elemento descritto sono elencati tra parentesi sotto forma di elenco. Puoi utilizzare i quantificatori per indicare la quantità (sono simili ai quantificatori delle espressioni regolari): +significa 1+ *significa 0+ ?significa 0OR 1 Se non sono stati aggiunti quantificatori, si presuppone che dovrebbe esserci solo 1 elemento. Se avessimo bisogno di uno di un gruppo di elementi, potremmo scriverlo in questo modo:
<!ELEMENT company ((name | offices))>
Poi verrebbe selezionato uno degli elementi: nome o sedi, ma se all'interno dell'azienda ce ne fossero due, la convalida non passerebbe. Puoi anche notare che in Employee c'è la parola EMPTY - questo significa che l'elemento deve essere vuoto. C'è anche QUALSIASI elemento. #PCDATA – dati di testo. ATTLIST Utilizzato per aggiungere attributi agli elementi. Dopo ATTLIST segue il nome dell'elemento desiderato, e dopo di esso un dizionario nella forma "nome attributo - tipo attributo", e alla fine puoi aggiungere #IMPLIED (facoltativo) o #REQUIRED (richiesto). CDATA – dati di testo. Esistono altri tipi, ma sono tutti minuscoli. ENTITY ENTITY viene utilizzato per dichiarare le abbreviazioni e il testo che verrà inserito su di esse. Infatti potremo semplicemente utilizzare in XML, al posto del testo completo, solo il nome dell'entità preceduto dal segno & e ; Dopo. Ad esempio: per distinguere tra markup HTML e semplici caratteri, la parentesi angolare sinistra viene spesso preceduta da lt; , devi solo mettere & prima di lt. Quindi non utilizzeremo il markup, ma semplicemente il simbolo <. Come puoi vedere, tutto è abbastanza semplice: dichiari gli elementi, spieghi quali elementi gli elementi dichiarati possono contenere, aggiungi attributi a questi elementi e, se lo desideri, puoi aggiungere entità per abbreviare alcune voci. E qui verrebbe da chiedersi: come utilizzare le nostre regole nel nostro file XML? Dopotutto, abbiamo semplicemente dichiarato le regole, ma non le abbiamo utilizzate in XML. Ci sono due modi per usarli in XML: 1. Incorporamento: scrivendo le regole DTD all'interno del file XML stesso, basta scrivere l'elemento root dopo la parola chiave DOCTYPE e racchiudere il nostro file DTD tra parentesi quadre.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company [
        <!-- Объявление возможных элементов -->
        <!ELEMENT employee EMPTY>
        <!ELEMENT employees (employee+)>
        <!ELEMENT office (employees)>
        <!ELEMENT offices (office+)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT company (name, offices)>

        <!-- Добавление атрибутов для элементов employee и office -->
        <!ATTLIST employee
        name CDATA #REQUIRED
        job  CDATA #REQUIRED
        >

        <!ATTLIST office
        floor CDATA #REQUIRED
        room  CDATA #REQUIRED
        >

        <!-- Добавление сущностей -->
        <!ENTITY M "Maksim">
        <!ENTITY I "Ivan">
        <!ENTITY F "Franklin">
]>

<company>
    <name>IT-Heaven</name>
    <!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
2. Importa: scriviamo tutte le nostre regole in un file DTD separato, dopodiché nel file XML utilizziamo la costruzione DOCTYPE del primo metodo, solo che al posto delle parentesi quadre è necessario scrivere SYSTEM e specificare un percorso assoluto o relativo al posizione corrente del file.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company SYSTEM "dtd_example1.dtd">

<company>
    <name>IT-Heaven</name>
    <!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <offices>
        <office floor="1" room="1">
            <employees>
                <employee name="&M;" job="Middle Software Developer" />
                <employee name="&I;" job="Junior Software Developer" />
                <employee name="&F;" job="Junior Software Developer" />
            </employees>
        </office>
        <office floor="1" room="2">
            <employees>
                <employee name="Herald" job="Middle Software Developer" />
                <employee name="Adam" job="Middle Software Developer" />
                <employee name="Leroy" job="Junior Software Developer" />
            </employees>
        </office>
    </offices>
</company>
Puoi anche usare la parola chiave PUBLIC invece di SYSTEM, ma è improbabile che ti sia utile. Se sei interessato, puoi leggere l'argomento (e anche il SYSTEM) in dettaglio qui: link . Adesso non possiamo usare altri elementi senza dichiararli nella DTD, e tutto l'XML è soggetto alle nostre regole. Puoi provare a scrivere questo codice in IntelliJ IDEA in un file separato con estensione .xml e provare ad aggiungere alcuni nuovi elementi o rimuovere un elemento dal nostro DTD e notare come l'IDE ti indicherà un errore. Tuttavia, il DTD presenta i suoi svantaggi:
  • Ha una propria sintassi, diversa dalla sintassi xml.
  • Un DTD non ha alcun controllo del tipo di dati e può contenere solo stringhe.
  • Non esiste uno spazio dei nomi in un DTD.
Riguardo al problema della tua sintassi: devi comprendere due sintassi contemporaneamente: sintassi XML e DTD. Sono diversi e questo potrebbe confonderti. Inoltre, per questo motivo è più difficile tenere traccia degli errori in file XML di grandi dimensioni insieme agli stessi schemi DTD. Se qualcosa non funziona per te, devi controllare un’enorme quantità di testo con sintassi diverse. È come leggere due libri contemporaneamente: in russo e inglese. E se la tua conoscenza di una lingua è peggiore, comprendere il testo sarà altrettanto difficile. Riguardo al problema del controllo del tipo di dati: gli attributi nei DTD hanno tipi diversi, ma sono tutti, nella loro essenza, rappresentazioni di stringhe di qualcosa, elenchi o collegamenti. Tuttavia non si possono pretendere solo numeri e soprattutto non positivi o negativi. E puoi dimenticarti completamente dei tipi di oggetto. L'ultimo problema sarà discusso nel prossimo articolo, che sarà dedicato ai namespace e agli schemi XML, poiché parlarne qui è inutile. Grazie a tutti per l'attenzione, ho lavorato tantissimo e continuo a farlo per finire in tempo tutta la serie di articoli. Fondamentalmente, devo solo capire gli schemi XML e fornirne una spiegazione in parole più chiare per completare il 2° articolo. La metà è già stata fatta, quindi puoi aspettartelo presto. L'ultimo articolo sarà interamente dedicato al lavoro con file XML utilizzando Java. Buona fortuna a tutti e successo nella programmazione :) Articolo successivo: [Concorso] Nozioni di base su XML per un programmatore Java - Parte 2 di 3
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION