JavaRush /Java Blog /Random-TW /Java 程式設計師的 XML 基礎知識 - 第 1 部分(共 3 部分)
Ярослав
等級 40
Днепр

Java 程式設計師的 XML 基礎知識 - 第 1 部分(共 3 部分)

在 Random-TW 群組發布
XML 是當今非常流行且靈活的格式。每個程式設計師都應該理解它,它是必須具備的。如今許多科技都在積極使用它,現代科技也在其中。
Java 程式設計師的 XML 基礎知識 - 第 1 部分(共 3 部分) - 1

介紹

你好,我的文章的親愛的讀者。我想說,這只是我的三篇文章系列的第一篇文章。整個系列的主要目標是引導每位讀者了解 XML,並提供(如果不是完整的解釋和理解)至少對其進行良好的推動,解釋要點和內容。整個週期將針對一項提名——「關注細節」,分為3篇文章,以適應帖子的字數限制,並將大量材料分成較小的部分,以便更好地理解。第一篇文章將專門介紹 XML 本身及其意義,以及為 XML 檔案建立模式的方法之一 - DTD。首先,我想為那些還不熟悉 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樹的根是公司。它也是所有其他元素都來自的根(root)元素。每個 XML 檔案只能有一個根元素。它必須在xml 檔案(範例中的第一行)聲明之後聲明,並包含所有其他元素。關於聲明的一些資訊:它是強制性的,並且需要將文件標識為 XML。它有三個偽屬性(特殊的預定義屬性):version(按照1.0標準)、encoding(編碼)和standalone(自治性:如果是並且外部scheme連接到文件上,那麼就會出現錯誤,預設沒有)。 元素是使用其他元素和屬性來儲存資料的實體。屬性是添加元素時指定的有關元素的附加資訊。如果我們將解釋翻譯成OOP字段,我們可以給出以下例子:我們有一輛車,每輛車都有特徵(顏色、容量、品牌等)——這些是屬性,汽車內部有實體:門、窗、引擎、方向盤是其他元素。您可以根據需要將屬性儲存為單一元素或屬性。畢竟,XML 是一種極其靈活的格式,可用於儲存任何資訊。解釋完之後,我們只需要看看上面的例子,一切就都明白了。在範例中,我們描述了一個簡單的公司結構:有一家公司,有名稱和辦公室,辦公室裡有員工。Employees 和 Offices 元素是包裝元素 - 它們用於收集相同類型的元素,本質上是將它們組合成一組以便於處理。地板和房間值得特別注意。這些是辦公室的屬性(樓層和號碼),換句話說,就是它的屬性。如果我們有一個「圖像」元素,那麼我們就可以轉移它的尺寸。您可能會注意到,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>
正如你所看到的,現在每個員工的姓名和職位都是他的屬性。您可以注意到員工實體(標籤)內沒有任何內容,所有員工元素都是空的。然後,您可以將員工設定為空元素 - 在聲明屬性後立即將其關閉。這很簡單,只需添加一個斜線:
<?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 的特點是您可以按照您想要的方式擴展它:使用您自己的元素、您自己的屬性,並按照您的意願建構它。您可以使用屬性和元素來儲存資料(如前面的範例所示)。但是,您需要了解,您可以隨心所欲地隨意想出自己的元素和屬性,但是如果您從事的專案中另一個程式設計師想要將名稱元素移動到屬性中,以及您的整個程式邏輯,該怎麼辦是這樣寫的,名字就是一個元素嗎?如何創建自己的關於元素應該是什麼、它們具有什麼屬性以及其他內容的規則,以便您可以驗證 XML 文件並確保這些規則將成為您專案中的標準並且沒有人會違反它們?為了編寫您自己的 XML 標記的所有規則,有一些特殊的工具。最有名的是:DTD 和 XML Schema。本文只講第一個。

DTD

DTD 是為了描述文件類型而建立的。DTD 已經過時,並且現在在 XML 中被積極放棄,但仍然有許多 XML 檔案使用 DTD,一般來說,理解 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 文件,有 3 種主要結構用於描述任何 XML 文件:ELEMENT(描述元素)、ATTLIST(描述元素屬性)和 ENTITY(以縮寫形式取代文字)。 ELEMENT 用於描述元素。可以在所描述的元素中使用的元素以列表形式列在括號中。您可以使用量詞來指示數量(它們與正規表示式中的量詞類似): +means1+ *表示0+ ?意思0OR1 如果未添加量詞,則假定應該只有 1 個元素。 如果我們需要一組元素中的一個,我們可以這樣寫:
<!ELEMENT company ((name | offices))>
然後會選擇其中一個元素:名稱或辦公室,但如果公司內部有其中兩個,則驗證不會通過。您還可以注意到,employee 中有單字 EMPTY - 這意味著該元素必須為空。還有 ANY - 任何元素。#PCDATA – 文字資料。 ATTLIST 用於為元素新增屬性。ATTLIST 之後是所需元素的名稱,後面是「屬性名稱 - 屬性類型」形式的字典,最後可以加上#IMPLIED(可選)或#REQUIRED(必需)。CDATA-文字資料。還有其他類型,但它們都是小寫的。 ENTITY ENTITY 用於聲明縮寫詞以及將放置在縮寫詞上的文字。事實上,我們可以在 XML 中使用前面帶有 & 符號的實體名稱,而不是全文。後。例如:為了區分 HTML 標記和字符,左尖括號通常用 lt 轉義;,你只需要把 & 放在 lt 之前。那我們就不會使用標記,而只是使用 < 符號。正如您所看到的,一切都非常簡單:聲明元素,解釋聲明的元素能夠包含哪些元素,向這些元素添加屬性,如果需要,您可以添加實體以縮短某些條目。在這裡您可能會問:如何在 XML 檔案中使用我們的規則?畢竟,我們只是聲明了規則,但沒有在 XML 中使用它們。在 XML 中使用它們的方法有兩種: 1. 嵌入 - 將 DTD 規則寫入 XML 文件本身,只需在 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>
您也可以使用 PUBLIC 關鍵字代替 SYSTEM,但它不太可能對您有用。如果您有興趣,您可以在這裡詳細閱讀它(以及系統):連結。現在,如果沒有在 DTD 中聲明,我們就不能使用其他元素,並且所有 XML 都遵守我們的規則。您可以嘗試在 IntelliJ IDEA 中以 .xml 副檔名的單獨檔案中編寫此程式碼,並嘗試新增一些新元素或從 DTD 中刪除元素,並注意 IDE 將如何向您指示錯誤。然而,DTD 也有其缺點:
  • 它有自己的語法,與 xml 語法不同。
  • DTD 沒有資料類型檢查,只能包含字串。
  • DTD 中沒有命名空間。
關於你自己文法的問題:你必須同時理解兩種文法:XML和DTD文法。它們是不同的,這可能會讓您感到困惑。此外,正因為如此,結合相同的 DTD 模式來追蹤大型 XML 檔案中的錯誤變得更加困難。如果某些東西不適合你,你必須檢查大量具有不同語法的文字。這就像同時閱讀兩本書:俄語和英語。如果你對一種語言的了解較差,那麼理解文本也會同樣困難。關於資料類型檢查的問題:DTD 中的屬性確實有不同的類型,但它們的核心都是某種東西、列表或連結的字串表示。然而,你不能只要求數字,尤其不能要求正數或負數。您可以完全忘記物件類型。最後一個問題將在下一篇文章中討論,該文章將專門討論命名空間和 XML 模式,因為在這裡討論它是沒有意義的。感謝大家的關注,為了按時完成整個系列文章,我做了很多工作並繼續做下去。基本上,我只需弄清楚 XML 模式並用更清晰的語言對其進行解釋即可完成第二篇文章。已經完成一半了,很快就可以期待了。上一篇文章將完全致力於使用 Java 處理 XML 檔案。祝大家好運,程式設計成功 :) 下一篇文章:[競賽] Java 程式設計師的 XML 基礎知識 - 第 2 部分(共 3 部分)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION