JavaRush /Java-Blog /Random-DE /XML-Grundlagen für Java-Programmierer – Teil 1 von 3
Ярослав
Level 40
Днепр

XML-Grundlagen für Java-Programmierer – Teil 1 von 3

Veröffentlicht in der Gruppe Random-DE
XML ist heutzutage ein sehr beliebtes und flexibles Format. Jeder Programmierer sollte es verstehen, es ist einfach ein Muss. Viele Technologien nutzen es heute aktiv, darunter auch moderne.
XML-Grundlagen für Java-Programmierer – Teil 1 von 3 – 1

Einführung

Hallo, liebe Leser meines Artikels. Ich möchte gleich sagen, dass dies nur der erste Artikel meiner dreiteiligen Artikelserie ist. Das Hauptziel der gesamten Serie besteht darin, jeden Leser in XML einzuführen und, wenn nicht eine vollständige Erklärung und ein vollständiges Verständnis, so doch zumindest einen guten Anstoß dazu zu geben, indem die wichtigsten Punkte und Dinge erläutert werden. Der gesamte Zyklus wird einer Nominierung gewidmet sein – „Liebe zum Detail“ , und die Aufteilung in drei Artikel erfolgt, um der Zeichenbeschränkung in Beiträgen gerecht zu werden und eine große Menge an Material zum besseren Verständnis in kleinere Teile aufzuteilen. Der erste Artikel widmet sich XML selbst und dem, was es ist, sowie einer der Möglichkeiten, ein Schema für XML-Dateien zu erstellen – DTD. Zunächst möchte ich ein kleines Vorwort für diejenigen machen, die sich mit XML noch nicht auskennen: Es besteht kein Grund zur Angst. XML ist nicht sehr kompliziert und sollte von jedem Programmierer verstanden werden, da es heute ein sehr flexibles, effizientes und beliebtes Dateiformat zum Speichern einer Vielzahl von gewünschten Informationen ist. XML wird in Ant, Maven, Spring verwendet. Jeder Programmierer benötigt XML-Kenntnisse. Nachdem Sie nun die Kraft und Motivation gesammelt haben, beginnen wir mit dem Lernen. Ich werde versuchen, das gesamte Material so einfach wie möglich zu gestalten, nur das Wichtigste zusammenzustellen und mich nicht auf das Unkraut einzulassen.

XML

Für eine klarere Erklärung wäre es besser, das XML anhand eines Beispiels zu visualisieren.
<?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 und XML ähneln sich in der Syntax, da sie ein gemeinsames übergeordnetes Element haben: SGML. Allerdings gibt es in HTML nur feste Tags eines bestimmten Standards, während Sie in XML Ihre eigenen Tags und Attribute erstellen und im Allgemeinen tun können, was Sie wollen, um Daten auf die für Sie passende Weise zu speichern. Tatsächlich können XML-Dateien von jedem gelesen werden, der Englisch kann. Dieses Beispiel kann anhand eines Baumes dargestellt werden. XML-Grundlagen für Java-Programmierer – Teil 1 von 3 – 2Die Wurzel des Baumes ist Company. Es ist auch das Wurzelelement (Wurzelelement), aus dem alle anderen Elemente stammen. Jede XML-Datei kann nur ein Stammelement haben. Es muss nach der Deklaration der XML-Datei (erste Zeile im Beispiel) deklariert werden und alle anderen Elemente enthalten. Ein wenig zur Deklaration: Sie ist obligatorisch und wird benötigt, um das Dokument als XML zu identifizieren. Es verfügt über drei Pseudoattribute (spezielle vordefinierte Attribute): Version (gemäß dem 1.0-Standard), Kodierung (Kodierung) und Standalone (Autonomie: Wenn ja und externe Schemata mit dem Dokument verbunden sind, wird ein Fehler angezeigt, die Standardeinstellung ist nein). Elemente sind Entitäten, die Daten mithilfe anderer Elemente und Attribute speichern. Attribute sind zusätzliche Informationen zu einem Element, die beim Hinzufügen eines Elements angegeben werden. Wenn wir die Erklärung in ein OOP-Feld übersetzen, können wir das folgende Beispiel geben: Wir haben ein Auto, jedes Auto hat Eigenschaften (Farbe, Kapazität, Marke usw.) – das sind Attribute, und es gibt Entitäten, die sich im Auto befinden : Türen, Fenster, Motor, Lenkrad sind weitere Elemente. Je nach Wunsch können Sie Eigenschaften entweder als einzelne Elemente oder als Attribute speichern. Schließlich ist XML ein äußerst flexibles Format zum Speichern von Informationen über alles. Nach den Erläuterungen müssen wir uns nur noch das obige Beispiel ansehen, damit alles passt. Im Beispiel haben wir eine einfache Firmenstruktur beschrieben: Es gibt eine Firma, die einen Namen und Büros hat, und in den Büros gibt es Mitarbeiter. Die Elemente „Employees“ und „Offices“ sind Wrapper-Elemente – sie dienen dazu, Elemente desselben Typs zu sammeln und sie zur einfacheren Verarbeitung im Wesentlichen zu einem Satz zusammenzufassen. Boden und Raum verdienen besondere Aufmerksamkeit. Dies sind die Attribute des Büros (Etage und Nummer), also seine Eigenschaften. Wenn wir ein „Bild“-Element hätten, könnten wir dessen Dimensionen übertragen. Möglicherweise stellen Sie fest, dass das Unternehmen über kein Namensattribut, aber über ein Namenselement verfügt. Sie können Strukturen einfach so beschreiben, wie Sie möchten. Niemand verpflichtet Sie, alle Eigenschaften von Elementen nur in Attributen zu schreiben; Sie können einfach Elemente verwenden und einige Daten in sie schreiben. Als Attribute können wir beispielsweise den Namen und die Position unserer Mitarbeiter erfassen:
<?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>
Wie Sie sehen, sind nun Name und Position jedes Mitarbeiters seine Attribute. Und Sie können feststellen, dass sich in der Mitarbeiterentität (Tag) nichts befindet, alle Mitarbeiterelemente sind leer. Dann können Sie „mitarbeiter“ zu einem leeren Element machen – schließen Sie es sofort nach der Deklaration der Attribute. Das geht ganz einfach, fügen Sie einfach einen Schrägstrich hinzu:
<?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>
Wie Sie sehen, haben wir durch das Schließen der leeren Elemente die vollständige Integrität der Informationen gewahrt und den Datensatz erheblich gekürzt, wodurch die Informationen prägnanter und lesbarer wurden. Um einen Kommentar (Text, der beim Parsen einer Datei übersprungen wird) in XML hinzuzufügen, gibt es die folgende Syntax:
<!-- Iwan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
Und die letzte Konstruktion ist CDATA , was „Zeichendaten“ bedeutet. Dank dieses Designs ist es möglich, Text zu schreiben, der nicht als XML-Markup interpretiert wird. Dies ist nützlich, wenn Sie eine Entität in der XML-Datei haben, die XML-Markup in den Informationen speichert. Beispiel:
<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
Das Besondere an XML ist, dass Sie es beliebig erweitern können: Verwenden Sie Ihre eigenen Elemente, Ihre eigenen Attribute und strukturieren Sie es nach Ihren Wünschen. Sie können sowohl Attribute als auch Elemente zum Speichern von Daten verwenden (wie im Beispiel zuvor gezeigt). Sie müssen jedoch verstehen, dass Sie Ihre eigenen Elemente und Attribute spontan und nach Belieben erstellen können. Was aber, wenn Sie an einem Projekt arbeiten, bei dem ein anderer Programmierer das Namenselement in Attribute und Ihre gesamte Programmlogik verschieben möchte? ist so geschrieben, dass der Name ein Element war? Wie können Sie Ihre eigenen Regeln darüber erstellen, welche Elemente sein sollen, welche Attribute sie haben und andere Dinge, damit Sie XML-Dateien validieren können und sicher sein können, dass die Regeln in Ihrem Projekt zum Standard werden und niemand gegen sie verstößt? Um alle Regeln Ihres eigenen XML-Markups zu schreiben, gibt es spezielle Tools. Die bekanntesten: DTD und XML-Schema. In diesem Artikel geht es nur um den ersten.

DTD

DTD wird erstellt, um Dokumenttypen zu beschreiben. DTD ist bereits veraltet und wird jetzt in XML aktiv aufgegeben, aber es gibt immer noch viele XML-Dateien, die DTD verwenden, und im Allgemeinen ist es nützlich, es zu verstehen. DTD ist eine Technologie zur Validierung von XML-Dokumenten . Eine DTD deklariert spezifische Regeln für einen Dokumenttyp: seine Elemente, welche Elemente innerhalb des Elements enthalten sein können, Attribute, ob sie erforderlich sind oder nicht, die Anzahl ihrer Wiederholungen sowie Entitäten. Ähnlich wie bei XML kann eine DTD für eine klarere Erklärung mit einem Beispiel visualisiert werden.
<!-- Объявление возможных элементов -->
<!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">
Hier haben wir ein so einfaches Beispiel. In diesem Beispiel haben wir unsere gesamte Hierarchie aus dem XML-Beispiel deklariert: Mitarbeiter, Mitarbeiter, Büro, Büros, Name, Firma. Zum Erstellen von DTD-Dateien werden drei Hauptkonstrukte zur Beschreibung von XML-Dateien verwendet: ELEMENT (zur Beschreibung von Elementen), ATTLIST (zur Beschreibung von Attributen für Elemente) und ENTITY (zur Ersetzung von Text durch abgekürzte Formen). ELEMENT Wird zur Beschreibung eines Elements verwendet. Die Elemente, die innerhalb des beschriebenen Elements verwendet werden können, sind in Klammern in Listenform aufgeführt. Sie können Quantoren verwenden, um Mengen anzugeben (sie ähneln Quantoren aus regulären Ausdrücken): +bedeutet 1+ *bedeutet 0+ ?bedeutet 0ODER 1 Wenn keine Quantoren hinzugefügt wurden, wird davon ausgegangen, dass es nur 1 Element geben sollte. Wenn wir eines aus einer Gruppe von Elementen benötigen, könnten wir es so schreiben:
<!ELEMENT company ((name | offices))>
Dann würde eines der Elemente ausgewählt: Name oder Büros, aber wenn es zwei davon innerhalb des Unternehmens gäbe, würde die Validierung nicht bestanden. Sie können auch feststellen, dass im Mitarbeiter das Wort EMPTY steht – das bedeutet, dass das Element leer sein muss. Es gibt auch ANY – beliebige Elemente. #PCDATA – Textdaten. ATTLIST Wird zum Hinzufügen von Attributen zu Elementen verwendet. Nach ATTLIST folgt der Name des gewünschten Elements und danach ein Wörterbuch der Form „Attributname – Attributtyp“. Am Ende können Sie #IMPLIED (optional) oder #REQUIRED (erforderlich) hinzufügen. CDATA – Textdaten. Es gibt andere Typen, die jedoch alle in Kleinbuchstaben geschrieben sind. ENTITY ENTITY wird verwendet, um Abkürzungen und den darauf platzierten Text anzugeben. Tatsächlich können wir in XML anstelle des vollständigen Textes einfach nur den Namen der Entität mit einem &-Zeichen vor und ; verwenden. nach. Zum Beispiel: Um zwischen HTML-Markup und reinen Zeichen zu unterscheiden, wird die linke spitze Klammer oft mit lt maskiert; , Sie müssen nur & vor lt setzen. Dann verwenden wir kein Markup, sondern einfach das <-Symbol. Wie Sie sehen, ist alles ganz einfach: Sie deklarieren Elemente, erklären, welche Elemente die deklarierten Elemente enthalten können, fügen diesen Elementen Attribute hinzu und können bei Bedarf Entitäten hinzufügen, um einige Einträge zu verkürzen. Und hier müssten Sie sich fragen: Wie verwenden wir unsere Regeln in unserer XML-Datei? Schließlich haben wir die Regeln lediglich deklariert, sie aber nicht in XML verwendet. Es gibt zwei Möglichkeiten, sie in XML zu verwenden: 1. Einbettung – Schreiben von DTD-Regeln in die XML-Datei selbst. Schreiben Sie einfach das Stammelement nach dem DOCTYPE-Schlüsselwort und schließen Sie unsere DTD-Datei in eckige Klammern ein.
<?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>
    <!-- Iwan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <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. Importieren – wir schreiben alle unsere Regeln in eine separate DTD-Datei, danach verwenden wir in der XML-Datei die DOCTYPE-Konstruktion aus der ersten Methode, nur müssen Sie anstelle von eckigen Klammern SYSTEM schreiben und einen absoluten oder relativen Pfad zum angeben aktueller Speicherort der Datei.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE company SYSTEM "dtd_example1.dtd">

<company>
    <name>IT-Heaven</name>
    <!-- Iwan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
    <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>
Sie können anstelle von SYSTEM auch das Schlüsselwort PUBLIC verwenden, es ist jedoch unwahrscheinlich, dass es für Sie nützlich ist. Wenn Sie interessiert sind, können Sie hier ausführlich darüber (und auch über SYSTEM) lesen: Link . Jetzt können wir keine anderen Elemente verwenden, ohne sie in der DTD zu deklarieren, und das gesamte XML unterliegt unseren Regeln. Sie können versuchen, diesen Code in IntelliJ IDEA in eine separate Datei mit der Erweiterung .xml zu schreiben und einige neue Elemente hinzuzufügen oder ein Element aus unserer DTD zu entfernen. Beachten Sie dabei, wie Ihnen die IDE einen Fehler anzeigt. Allerdings hat DTD seine Nachteile:
  • Es verfügt über eine eigene Syntax, die sich von der XML-Syntax unterscheidet.
  • Eine DTD hat keine Datentypprüfung und kann nur Zeichenfolgen enthalten.
  • In einer DTD gibt es keinen Namensraum.
Zum Problem Ihrer eigenen Syntax: Sie müssen zwei Syntaxen gleichzeitig verstehen: XML- und DTD-Syntax. Sie sind unterschiedlich und das könnte Sie verwirren. Aus diesem Grund ist es auch schwieriger, Fehler in großen XML-Dateien in Verbindung mit denselben DTD-Schemas zu verfolgen. Wenn bei Ihnen etwas nicht funktioniert, müssen Sie eine große Textmenge mit unterschiedlichen Syntaxen überprüfen. Es ist, als würde man zwei Bücher gleichzeitig lesen: auf Russisch und Englisch. Und wenn Ihre Kenntnisse in einer Sprache schlechter sind, wird es genauso schwierig sein, den Text zu verstehen. Zum Problem der Datentypprüfung: Attribute in DTDs haben zwar unterschiedliche Typen, aber im Kern sind sie alle String-Darstellungen von etwas, Listen oder Links. Allerdings kann man nicht nur Zahlen verlangen, schon gar nicht positive oder negative. Und Sie können Objekttypen völlig vergessen. Das letzte Problem wird im nächsten Artikel besprochen, der sich mit Namespaces und XML-Schemas befasst, da es hier keinen Sinn macht, es zu diskutieren. Vielen Dank für Ihre Aufmerksamkeit. Ich habe viel Arbeit geleistet und werde dies auch weiterhin tun, um die gesamte Artikelserie pünktlich fertigzustellen. Im Grunde muss ich nur noch die XML-Schemata herausfinden und sie in klareren Worten erklären, um den zweiten Artikel fertigzustellen. Die Hälfte davon ist bereits fertig, Sie können also bald damit rechnen. Der letzte Artikel ist ausschließlich der Arbeit mit XML-Dateien mit Java gewidmet. Viel Glück an alle und Erfolg beim Programmieren :) Nächster Artikel: [Wettbewerb] XML-Grundlagen für einen Java-Programmierer – Teil 2 von 3
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION