JavaRush /Java Blog /Random-JA /Java プログラマーのための XML の基礎 - パート 1/3
Ярослав
レベル 40
Днепр

Java プログラマーのための XML の基礎 - パート 1/3

Random-JA グループに公開済み
XML は現在、非常に人気のある柔軟な形式です。すべてのプログラマはこれを理解する必要があり、単に必須のものです。今日、多くのテクノロジーが積極的に使用しており、最新のテクノロジーもその中にあります。
Java プログラマのための XML の基礎 - パート 1/3 - 1

導入

私の記事を読んでいる親愛なる皆さん、こんにちは。すぐに言っておきたいのですが、これは 3 つの記事シリーズの最初の記事にすぎません。シリーズ全体の主な目標は、各読者に XML の入門を開始し、完全な説明と理解ではないにしても、主要な点や内容を説明して、少なくとも XML に向けて十分に推進できるようにすることです。全体のサイクルは「細部へのこだわり」という 1 つの候補に対して行われます。投稿の文字数制限に収まり、大量の内容をよりよく理解できるように小さな部分に分割するために、3 つの記事に分割されています。最初の記事では、XML 自体とその概要、および XML ファイルのスキーマを作成する方法の 1 つである DTD について説明します。まず、XML にまだ慣れていない人のために簡単な前置きをしておきます。怖がる必要はありません。XML はそれほど複雑ではなく、プログラマであれば誰でも理解できるはずです。XML は、必要なさまざまな情報を保存するための非常に柔軟で効率的で、今日人気のファイル形式です。XML は Ant、Maven、Spring で使用されます。すべてのプログラマーには XML の知識が必要です。体力もやる気も出てきたので、勉強を始めましょう。すべての資料をできるだけシンプルにレイアウトし、最も重要なものだけを集め、雑草に入らないように努めます。

XML

より明確に説明するには、例を使用して XML を視覚化することをお勧めします。

<?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 と XML は、共通の親である SGML を持っているため、構文が似ています。ただし、HTML には特定の標準の固定タグしかありませんが、XML では独自のタグや属性を作成し、一般に、自分に合った方法でデータを保存するために必要な操作を行うことができます。実際、XML ファイルは英語ができる人なら誰でも読むことができます。この例は、ツリーを使用して表すことができます。 Java プログラマのための XML の基礎 - パート 1/3 - 2ツリーのルートは会社です。これは、他のすべての要素の元となるルート (ルート) 要素でもあります。各 XML ファイルにはルート要素を 1 つだけ含めることができます。これは、 xml ファイルの宣言(例の最初の行)の後に宣言し、他のすべての要素を含める必要があります。宣言について少し説明します。宣言は必須であり、ドキュメントを XML として識別するために必要です。これには 3 つの疑似属性 (特別な事前定義された属性) があります: バージョン (1.0 標準による)、エンコーディング (エンコーディング)、およびスタンドアロン (自律性: はいで外部スキームがドキュメントに接続されている場合、エラーが発生します。デフォルト)いいえ)。 要素は、他の要素や属性を使用してデータを保存するエンティティです。属性は、要素を追加するときに指定される要素に関する追加情報です。この説明を OOP フィールドに変換すると、次の例が得られます。私たちは車を持っています。各車には特性 (色、容量、ブランドなど) があります。これらは属性であり、車の中にエンティティがあります。 : ドア、窓、エンジン、ステアリングホイールはその他の要素です。必要に応じて、プロパティを個別の要素または属性として保存できます。結局のところ、XML はあらゆる情報を保存できる非常に柔軟な形式です。説明が終わったら、上の例を見てすべてを理解するだけです。この例では、単純な会社構造について説明しました。つまり、名前とオフィスを持つ会社があり、オフィスには従業員がいます。Employees 要素と Offices 要素はラッパー要素です。これらは同じタイプの要素を収集する役割を果たし、基本的に処理を容易にするためにそれらを 1 つのセットに結合します。床と部屋は特に注意が必要です。これらはオフィスの属性(フロアと番号)、つまりプロパティです。「画像」要素がある場合は、その寸法を転送できます。company には name 属性はありませんが、name 要素があることに気づくかもしれません。必要に応じて構造を簡単に記述できます。要素のすべてのプロパティを属性にのみ記述することを義務付ける人はいません。要素だけを使用し、その中にデータを書き込むことができます。たとえば、従業員の名前と役職を属性として記録できます。

<?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>
ご覧のとおり、各従業員の名前と役職がその属性になります。そして、従業員エンティティ (タグ) 内には何もなく、すべての従業員要素が空であることがわかります。次に、employee を空の要素にして、属性を宣言した後すぐに閉じます。これは非常に簡単に行われ、スラッシュを追加するだけです。

<?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>
ご覧のとおり、空の要素を閉じることで、情報全体の整合性が維持され、レコードが大幅に短縮され、情報がより簡潔で読みやすくなりました。XML にコメント(ファイルの解析時にスキップされるテキスト) を 追加するには、次の構文があります。

<!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
そして最後の構造はCDATAで、これは「文字データ」を意味します。この設計のおかげで、XML マークアップとして解釈されないテキストを記述することが可能になります。これは、情報に XML マークアップを格納するエンティティが XML ファイル内にある場合に便利です。例:

<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
XML の利点は、必要に応じて拡張できることです。独自の要素、属性を使用し、必要に応じて構造化できます。(前の例で示したように) 属性と要素の両方を使用してデータを保存できます。ただし、独自の要素と属性をその場で好きなように思いつくことができることを理解する必要がありますが、別のプログラマーが name 要素を属性に移動し、プログラム ロジック全体を移動したいプロジェクトに取り組んでいる場合はどうなるでしょうか。はその名前が要素であるように書かれていますか?XML ファイルを検証し、そのルールがプロジェクトの標準となり、誰もルールに違反しないようにするには、どのような要素でなければならないか、どのような属性を持つかなどについて独自のルールを作成するにはどうすればよいでしょうか? 独自の XML マークアップのルールをすべて記述するために、特別なツールがあります。最も有名なものは、DTD と XML スキーマです。この記事では最初のものについてのみ説明します。

DTD

DTD はドキュメントの種類を記述するために作成されます。DTD はすでに時代遅れになりつつあり、XML では現在積極的に廃止されていますが、DTD を使用する XML ファイルは依然として多く存在しており、一般に、DTD を理解することは役に立ちます。 DTD は、XML ドキュメントを検証するためのテクノロジです。DTD は、ドキュメント タイプの特定のルール、つまりその要素、要素内に含めることができる要素、属性、必須かどうか、その繰り返しの数、およびエンティティを宣言します。XML と同様に、DTD は例を使用して視覚化することで、より明確に説明できます。

 <!-- Объявление возможных элементов -->
<!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">
ここにそのような単純な例があります。この例では、XML の例から階層全体を宣言しました (従業員、従業員、オフィス、オフィス、名前、会社)。DTD ファイルを作成するには、XML ファイルの記述に 3 つの主な構造が使用されます。ELEMENT (要素を記述する)、ATTLIST (要素の属性を記述する)、および ENTITY (テキストを省略形で置き換える)。 ELEMENT 要素を説明するために使用されます。記述された要素内で使用できる要素は、リスト形式で括弧内にリストされます。量指定子を使用して量を示すことができます (量指定子は正規表現の量指定子に似ています): +means 1+ *means 0+ ?means 0OR1 量指定子が追加されていない場合は、要素が 1 つだけであるとみなされます。 要素のグループの 1 つが必要な場合は、次のように記述できます。

<!ELEMENT company ((name | offices))>
次に、要素の 1 つ (名前またはオフィス) が選択されますが、社内に 2 つある場合は検証に合格しません。また、employee に EMPTY という単語があることにも注目してください。これは、要素が空である必要があることを意味します。ANY - 任意の要素もあります。#PCDATA – テキスト データ。 ATTLIST 要素に属性を追加するために使用されます。ATTLIST の後に目的の要素の名前が続き、その後に「属性名 - 属性タイプ」の形式の辞書が続き、最後に #IMPLIED (オプション) または #REQUIRED (必須) を追加できます。CDATA – テキスト データ。他にも種類はありますが、すべて小文字です。 ENTITY ENTITY は、略語とそれに配置されるテキストを宣言するために使用されます。実際、XML では、フルテキストの代わりに、 と ; の前に & 記号が付いたエンティティの名前だけを使用できます。後。たとえば、HTML マークアップと単なる文字を区別するために、左山括弧は lt でエスケープされることがよくあります。、lt の前に & を置くだけです。次に、マークアップを使用せず、単に < 記号を使用します。ご覧のとおり、すべては非常に簡単です。要素を宣言し、宣言された要素にどのような要素を含めることができるかを説明し、これらの要素に属性を追加し、必要に応じてエンティティを追加して一部のエントリを短縮できます。ここで、XML ファイルでルールをどのように使用するかという疑問が生じるでしょう。結局のところ、ルールを宣言しただけで、XML では使用しませんでした。XML でこれらを使用するには、次の 2 つの方法があります。 1. 埋め込み - XML ファイル自体の中に DTD ルールを記述します。DOCTYPE キーワードの後に​​ルート要素を記述し、DTD ファイルを角括弧で囲みます。

<?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. インポート - すべてのルールを別の DTD ファイルに記述します。その後、XML ファイルで最初のメソッドの DOCTYPE 構造を使用します。角括弧の代わりに SYSTEM を記述し、絶対パスまたは相対パスを指定する必要があるだけです。ファイルの現在の場所。

<?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>
SYSTEM の代わりに PUBLIC キーワードを使用することもできますが、役に立ちそうにありません。ご興味がございましたら、リンク (リンク) でそれについて (およびシステムについても) 詳しく読むことができます。現在は、DTD で宣言せずに他の要素を使用することはできず、すべての XML がルールの対象となります。IntelliJ IDEA でこのコードを .xml 拡張子の付いた別のファイルに記述して、新しい要素を追加したり、DTD から要素を削除したりして、IDE がどのようにエラーを示すかを確認してください。ただし、DTD には次のような欠点があります。
  • XML 構文とは異なる独自の構文があります。
  • DTD にはデータ型チェックがなく、文字列のみを含めることができます。
  • DTD には名前空間はありません。
独自の構文の問題について: XML 構文と DTD 構文の 2 つの構文を同時に理解する必要があります。それらは異なるため、混乱するかもしれません。また、このため、同じ DTD スキーマと組み合わせた巨大な XML ファイル内のエラーを追跡することがより困難になります。何かがうまくいかない場合は、さまざまな構文で大量のテキストをチェックする必要があります。ロシア語と英語の 2 冊の本を同時に読んでいるようなものです。また、ある言語の知識が劣っている場合、テキストを理解することも同様に困難になります。データ型チェックの問題について: DTD の属性にはさまざまな型がありますが、それらはすべて、本質的には何か、リスト、またはリンクの文字列表現です。ただし、数値だけを要求することはできません。特にプラスまたはマイナスの数値を要求することはできません。また、オブジェクトの種類については完全に忘れることもできます。最後の問題については、ここで議論しても意味がないため、名前空間と XML スキーマに特化した次の記事で説明します。ご静聴いただきありがとうございます。一連の記事を時間通りに終えるために、私は多くの仕事をしてきましたし、これからも努力を続けます。基本的には、XML スキーマを理解して、それをより明確な言葉で説明して、2 番目の記事を完成させるだけです。半分はすでに完了しているので、すぐに完成すると思われます。最後の記事では、Java を使用した XML ファイルの操作に専念します。皆さんの幸運とプログラミングの成功をお祈りします:) 次の記事: [コンテスト] Java プログラマーのための XML の基礎 - パート 2/3
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION