JavaRush /Blog Java /Random-VI /Kiến thức cơ bản về XML dành cho lập trình viên Java - Ph...
Ярослав
Mức độ
Днепр

Kiến thức cơ bản về XML dành cho lập trình viên Java - Phần 1/3

Xuất bản trong nhóm
XML là một định dạng rất phổ biến và linh hoạt hiện nay. Mọi lập trình viên nên hiểu nó, đơn giản là nó phải có. Ngày nay có nhiều công nghệ được kết nối, họ tích cực sử dụng nó và những công nghệ hiện đại nằm trong số đó.
Kiến thức cơ bản về XML dành cho lập trình viên Java - Phần 1/3 - 1

Giới thiệu

Xin chào các độc giả thân mến của bài viết của tôi. Tôi muốn nói ngay rằng đây chỉ là bài viết đầu tiên trong chuỗi ba bài viết của tôi. Mục tiêu chính của toàn bộ loạt bài này là giúp mỗi người đọc bắt đầu làm quen với XML và đưa ra, nếu không phải là một lời giải thích và hiểu biết đầy đủ, thì ít nhất cũng là một động lực thúc đẩy nó, giải thích những điểm và sự việc chính. Toàn bộ chu trình sẽ dành cho một đề cử - “Chú ý đến chi tiết” , và việc chia thành 3 bài được thực hiện để phù hợp với giới hạn ký tự trong các bài đăng và chia một lượng lớn tài liệu thành các phần nhỏ hơn để dễ hiểu hơn. Bài viết đầu tiên sẽ dành cho chính XML và nó là gì, cũng như một trong những cách tạo lược đồ cho các tệp XML - DTD. Để bắt đầu, tôi muốn viết một lời nói đầu nhỏ cho những người chưa quen với XML: không cần phải sợ hãi. XML không phức tạp lắm và bất kỳ lập trình viên nào cũng nên hiểu vì đây là định dạng tệp rất linh hoạt, hiệu quả và phổ biến hiện nay để lưu trữ nhiều loại thông tin mà bạn muốn. XML được sử dụng trong Ant, Maven, Spring. Bất kỳ lập trình viên nào cũng cần có kiến ​​thức về XML. Bây giờ bạn đã tập hợp được sức mạnh và động lực, hãy bắt đầu học. Tôi sẽ cố gắng sắp xếp tất cả các tài liệu một cách đơn giản nhất có thể, chỉ thu thập những thứ quan trọng nhất và không đi sâu vào cỏ dại.

XML

Để giải thích rõ ràng hơn, tốt hơn nên hình dung XML bằng một ví dụ.
<?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 và XML giống nhau về cú pháp vì chúng có chung một cha - SGML. Tuy nhiên, trong HTML chỉ có các thẻ cố định theo một tiêu chuẩn cụ thể, trong khi ở XML, bạn có thể tạo các thẻ, thuộc tính của riêng mình và nói chung, làm bất cứ điều gì bạn muốn để lưu trữ dữ liệu theo cách phù hợp với mình. Trên thực tế, bất kỳ ai biết tiếng Anh đều có thể đọc được các tệp XML. Ví dụ này có thể được mô tả bằng cách sử dụng một cái cây. Kiến thức cơ bản về XML dành cho lập trình viên Java - Phần 1/3 - 2Gốc của cây là Công ty. Nó cũng là phần tử gốc (gốc) mà từ đó tất cả các phần tử khác hình thành. Mỗi tệp XML chỉ có thể có một phần tử gốc. Nó phải được khai báo sau khi khai báo tệp xml (dòng đầu tiên trong ví dụ) và chứa tất cả các phần tử khác. Một chút về việc khai báo: việc xác định tài liệu là bắt buộc và cần thiết là XML. Nó có ba thuộc tính giả (thuộc tính đặc biệt được xác định trước): phiên bản (theo tiêu chuẩn 1.0), mã hóa (mã hóa) và độc lập (tự chủ: nếu có và các sơ đồ bên ngoài được kết nối với tài liệu thì sẽ xảy ra lỗi, mặc định là không). Phần tử là các thực thể lưu trữ dữ liệu bằng cách sử dụng các phần tử và thuộc tính khác. Thuộc tính là thông tin bổ sung về một phần tử được chỉ định khi thêm một phần tử. Nếu dịch lời giải thích sang trường OOP, chúng ta có thể đưa ra ví dụ sau: chúng ta có một chiếc ô tô, mỗi chiếc ô tô có các đặc điểm (màu sắc, dung tích, nhãn hiệu, v.v.) - đây là các thuộc tính và có các thực thể bên trong ô tô : cửa ra vào, cửa sổ, động cơ, vô lăng là những yếu tố khác. Bạn có thể lưu trữ các thuộc tính dưới dạng các phần tử riêng lẻ hoặc dưới dạng thuộc tính, tùy theo mong muốn của bạn. Xét cho cùng, XML là một định dạng cực kỳ linh hoạt để lưu trữ thông tin về mọi thứ. Sau khi giải thích, chúng ta chỉ cần nhìn vào ví dụ trên để mọi thứ đâu vào đấy. Trong ví dụ này, chúng tôi đã mô tả một cấu trúc công ty đơn giản: có một công ty có tên và văn phòng, và trong văn phòng có nhân viên. Các phần tử Nhân viên và Văn phòng là các phần tử bao bọc - chúng dùng để thu thập các phần tử cùng loại, về cơ bản kết hợp chúng thành một bộ để dễ xử lý. Tầng và phòng xứng đáng được chú ý đặc biệt. Đây là các thuộc tính của văn phòng (tầng và số), hay nói cách khác là thuộc tính của nó. Nếu chúng ta có phần tử "hình ảnh" thì chúng ta có thể chuyển kích thước của nó. Bạn có thể nhận thấy rằng công ty không có thuộc tính tên nhưng có thành phần tên. Bạn có thể mô tả đơn giản các cấu trúc theo cách bạn muốn. Không ai bắt buộc bạn phải viết tất cả thuộc tính của các phần tử chỉ trong thuộc tính; bạn chỉ có thể sử dụng các phần tử và viết một số dữ liệu bên trong chúng. Ví dụ: chúng tôi có thể ghi lại tên và vị trí của nhân viên dưới dạng thuộc tính:
<?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>
Như bạn có thể thấy, bây giờ tên và chức vụ của mỗi nhân viên đều là thuộc tính của anh ta. Và bạn có thể nhận thấy rằng không có gì bên trong thực thể nhân viên (thẻ), tất cả các phần tử nhân viên đều trống. Sau đó, bạn có thể đặt nhân viên thành một phần tử trống - đóng nó ngay sau khi khai báo các thuộc tính. Việc này được thực hiện khá đơn giản, chỉ cần thêm dấu gạch chéo:
<?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>
Như bạn có thể thấy, bằng cách đóng các phần tử trống, chúng tôi đã bảo toàn toàn bộ tính toàn vẹn của thông tin và rút ngắn đáng kể bản ghi, giúp thông tin ngắn gọn và dễ đọc hơn. Để thêm nhận xét (văn bản sẽ bị bỏ qua khi phân tích tệp) trong XML, có cú pháp sau:
<!-- Ivan недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка.-->
Và cấu trúc cuối cùng là CDATA , có nghĩa là “dữ liệu ký tự”. Nhờ thiết kế này, có thể viết văn bản sẽ không được hiểu là đánh dấu XML. Điều này hữu ích nếu bạn có một thực thể bên trong tệp XML lưu trữ đánh dấu XML trong thông tin. Ví dụ:
<?xml version="1.0" encoding="UTF-8" ?>
<bean>
    <information>
        <![CDATA[<name>Ivan</name><age>26</age>]]>
    </information>
</bean>
Vấn đề ở XML là bạn có thể mở rộng nó theo cách bạn muốn: sử dụng các phần tử, thuộc tính của riêng bạn và cấu trúc nó theo ý muốn. Bạn có thể sử dụng cả thuộc tính và phần tử để lưu trữ dữ liệu (như được hiển thị trong ví dụ trước đó). Tuy nhiên, bạn cần hiểu rằng bạn có thể nhanh chóng đưa ra các phần tử và thuộc tính của riêng mình theo cách bạn muốn, nhưng điều gì sẽ xảy ra nếu bạn làm việc trong một dự án mà một lập trình viên khác muốn chuyển phần tử tên thành các thuộc tính và toàn bộ logic chương trình của bạn? được viết sao cho tên đó là một phần tử? Làm cách nào bạn có thể tạo các quy tắc của riêng mình về những thành phần nào nên có, thuộc tính nào của chúng và những thứ khác để bạn có thể xác thực các tệp XML và đảm bảo rằng các quy tắc đó sẽ trở thành tiêu chuẩn trong dự án của bạn và không ai vi phạm chúng? Để viết tất cả các quy tắc đánh dấu XML của riêng bạn, có những công cụ đặc biệt. Nổi tiếng nhất: Lược đồ DTD và XML. Bài viết này sẽ chỉ nói về cái đầu tiên.

DTD

DTD được tạo ra để mô tả các loại tài liệu. DTD đã trở nên lỗi thời và hiện đang bị loại bỏ tích cực trong XML, nhưng vẫn còn nhiều tệp XML sử dụng DTD và nói chung, việc hiểu nó rất hữu ích. DTD là một công nghệ để xác thực các tài liệu XML . DTD khai báo các quy tắc cụ thể cho một loại tài liệu: các phần tử của nó, những phần tử nào có thể có bên trong phần tử đó, các thuộc tính, liệu chúng có được yêu cầu hay không, số lần lặp lại của chúng, cũng như các Thực thể. Tương tự như XML, DTD có thể được hiển thị bằng một ví dụ để giải thích rõ ràng hơn.
<!-- Объявление возможных элементов -->
<!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">
Ở đây chúng tôi có một ví dụ đơn giản như vậy. Trong ví dụ này, chúng tôi đã khai báo toàn bộ hệ thống phân cấp của mình từ ví dụ XML: nhân viên, nhân viên, văn phòng, văn phòng, tên, công ty. Để tạo tệp DTD, có 3 cấu trúc chính được sử dụng để mô tả bất kỳ tệp XML nào: ELEMENT (để mô tả các phần tử), ATTLIST (để mô tả thuộc tính cho các phần tử) và ENTITY (để thay thế văn bản bằng dạng viết tắt). ELEMENT Được sử dụng để mô tả một phần tử. Các phần tử có thể được sử dụng trong phần tử được mô tả được liệt kê trong dấu ngoặc đơn ở dạng danh sách. Bạn có thể sử dụng bộ định lượng để biểu thị số lượng (chúng tương tự như bộ định lượng trong các biểu thức thông thường): +có nghĩa là 1+ *phương tiện HOẶC Nếu không có bộ định lượng nào được thêm vào thì giả định rằng chỉ nên có 1 phần tử. Nếu chúng ta cần một trong các nhóm phần tử, chúng ta có thể viết nó như thế này: 0+ ?01
<!ELEMENT company ((name | offices))>
Sau đó, một trong các yếu tố sẽ được chọn: tên hoặc văn phòng, nhưng nếu có hai yếu tố đó trong công ty thì quá trình xác thực sẽ không vượt qua. Bạn cũng có thể nhận thấy rằng trong nhân viên có từ EMPTY - điều này có nghĩa là phần tử phải trống. Ngoài ra còn có BẤT CỨ - bất kỳ yếu tố nào. #PCDATA – dữ liệu văn bản. ATTLIST Được sử dụng để thêm thuộc tính cho phần tử. Sau ATTLIST theo sau tên của phần tử mong muốn và sau đó là từ điển có dạng “tên thuộc tính - loại thuộc tính”, và ở cuối, bạn có thể thêm #IMPLIED (tùy chọn) hoặc #REQUIRED (bắt buộc). CDATA – dữ liệu văn bản. Có nhiều loại khác, nhưng chúng đều là chữ thường. ENTITY ENTITY được sử dụng để khai báo các chữ viết tắt và văn bản sẽ được đặt trên chúng. Trên thực tế, chúng ta sẽ chỉ có thể sử dụng trong XML, thay vì sử dụng toàn văn, chỉ tên của thực thể có dấu & trước và ; sau đó. Ví dụ: để phân biệt giữa đánh dấu HTML và chỉ các ký tự, dấu ngoặc nhọn bên trái thường được thoát bằng lt; , bạn chỉ cần đặt & trước lt. Khi đó chúng ta sẽ không sử dụng đánh dấu mà chỉ sử dụng ký hiệu <. Như bạn có thể thấy, mọi thứ khá đơn giản: bạn khai báo các phần tử, giải thích những phần tử mà phần tử khai báo có khả năng chứa, thêm thuộc tính cho các phần tử này và nếu muốn, bạn có thể thêm các thực thể để rút ngắn một số mục. Và ở đây bạn sẽ phải hỏi: làm cách nào để sử dụng các quy tắc trong tệp XML của chúng tôi? Suy cho cùng, chúng ta chỉ khai báo các quy tắc nhưng không sử dụng chúng trong XML. Có hai cách để sử dụng chúng trong XML: 1. Nhúng - viết các quy tắc DTD bên trong chính tệp XML, chỉ cần viết phần tử gốc sau từ khóa DOCTYPE và đặt tệp DTD của chúng ta vào trong dấu ngoặc vuông.
<?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. Nhập - chúng tôi viết tất cả các quy tắc của mình trong một tệp DTD riêng biệt, sau đó trong tệp XML, chúng tôi sử dụng cấu trúc DOCTYPE từ phương thức đầu tiên, chỉ thay vì dấu ngoặc vuông, bạn cần viết HỆ THỐNG và chỉ định đường dẫn tuyệt đối hoặc tương đối đến vị trí hiện tại của tập tin.
<?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>
Bạn cũng có thể sử dụng từ khóa PUBLIC thay vì SYSTEM, nhưng nó có thể không hữu ích với bạn. Nếu quan tâm, bạn có thể đọc chi tiết về nó (và cả về HỆ THỐNG nữa) tại đây: link . Bây giờ chúng tôi không thể sử dụng các phần tử khác mà không khai báo chúng trong DTD và tất cả XML đều phải tuân theo các quy tắc của chúng tôi. Bạn có thể thử viết mã này trong IntelliJ IDEA trong một tệp riêng có phần mở rộng .xml và thử thêm một số thành phần mới hoặc xóa một thành phần khỏi DTD của chúng tôi và để ý xem IDE sẽ chỉ ra lỗi cho bạn như thế nào. Tuy nhiên, DTD có nhược điểm:
  • Nó có cú pháp riêng, khác với cú pháp xml.
  • DTD không kiểm tra kiểu dữ liệu và chỉ có thể chứa các chuỗi.
  • Không có không gian tên trong DTD.
Về vấn đề cú pháp của riêng bạn: bạn phải hiểu cùng lúc hai cú pháp: cú pháp XML và DTD. Chúng khác nhau và điều này có thể khiến bạn bối rối. Ngoài ra, vì điều này, việc theo dõi lỗi trong các tệp XML lớn kết hợp với cùng các lược đồ DTD sẽ khó khăn hơn. Nếu có điều gì đó không hiệu quả với bạn, bạn phải kiểm tra một lượng lớn văn bản với các cú pháp khác nhau. Nó giống như đọc hai cuốn sách cùng một lúc: bằng tiếng Nga và tiếng Anh. Và nếu kiến ​​​​thức về một ngôn ngữ của bạn kém hơn thì việc hiểu văn bản cũng sẽ khó khăn không kém. Về vấn đề kiểm tra kiểu dữ liệu: các thuộc tính trong DTD có nhiều kiểu khác nhau, nhưng về cốt lõi, chúng đều là biểu diễn chuỗi của một cái gì đó, danh sách hoặc liên kết. Tuy nhiên, bạn không thể chỉ yêu cầu những con số, đặc biệt là những con số dương hoặc âm. Và bạn hoàn toàn có thể quên đi các loại đối tượng. Vấn đề cuối cùng sẽ được thảo luận trong bài viết tiếp theo, sẽ được dành riêng cho các không gian tên và lược đồ XML, vì việc thảo luận về nó ở đây là vô nghĩa. Cảm ơn mọi người đã quan tâm, mình đã làm rất nhiều việc và sẽ tiếp tục làm để hoàn thành toàn bộ loạt bài đúng thời hạn. Về cơ bản, tôi chỉ cần tìm ra các lược đồ XML và đưa ra lời giải thích về chúng bằng những từ ngữ rõ ràng hơn là có thể hoàn thành bài viết thứ 2. Một nửa công việc đã được thực hiện xong nên bạn có thể mong đợi nó sớm thôi. Bài viết cuối cùng sẽ hoàn toàn dành cho việc làm việc với các tệp XML bằng Java. Chúc mọi người may mắn và lập trình thành công :) Bài tiếp theo: [Cuộc thi] Kiến thức cơ bản về XML dành cho lập trình viên Java - Phần 2/3
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION