JavaRush /בלוג Java /Random-HE /יסודות XML עבור מתכנת Java - חלק 1 מתוך 3
Ярослав
רָמָה
Днепр

יסודות XML עבור מתכנת Java - חלק 1 מתוך 3

פורסם בקבוצה
XML הוא פורמט מאוד פופולרי וגמיש בימינו. כל מתכנת צריך להבין את זה, זה פשוט חובה. טכנולוגיות רבות כיום משתמשות בו באופן פעיל, וביניהם מודרניות.
יסודות XML עבור מתכנת Java - חלק 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 יכולים להיקרא על ידי כל מי שיודע אנגלית. ניתן לתאר דוגמה זו באמצעות עץ. יסודות XML עבור מתכנת Java - חלק 1 מתוך 3 - 2שורש העץ הוא חברה. זהו גם יסוד השורש (שורש) ממנו מגיעים כל שאר היסודות. לכל קובץ XML יכול להיות רק אלמנט שורש אחד. יש להכריז עליו לאחר ההכרזה על קובץ ה-xml (השורה הראשונה בדוגמה) ולהכיל את כל שאר האלמנטים. קצת על ההצהרה: היא חובה ונדרשת כדי לזהות את המסמך כ-XML. יש לו שלוש תכונות פסאודו (תכונות מיוחדות מוגדרות מראש): גרסה (לפי תקן 1.0), קידוד (קידוד) ועצמאי (אוטונומיה: אם כן וסכמות חיצוניות מחוברות למסמך, אז תהיה שגיאה, ברירת המחדל זה לא). אלמנטים הם ישויות המאחסנות נתונים באמצעות אלמנטים ותכונות אחרים. תכונות הן מידע נוסף על אלמנט שצוין בעת ​​הוספת אלמנט. אם נתרגם את ההסבר לשדה OOP, נוכל לתת את הדוגמה הבאה: יש לנו מכונית, לכל מכונית יש מאפיינים (צבע, קיבולת, מותג וכו') - אלו תכונות, ויש ישויות שנמצאות בתוך המכונית : דלתות, חלונות, מנוע, גלגל ההגה הם אלמנטים נוספים. אתה יכול לאחסן מאפיינים כאלמנטים בודדים או כתכונות, בהתאם לרצונך. אחרי הכל, XML הוא פורמט גמיש במיוחד לאחסון מידע על כל דבר. אחרי ההסברים, אנחנו רק צריכים להסתכל על הדוגמה שלמעלה כדי שהכל יגיע למקומו. בדוגמה תיארנו מבנה חברה פשוט: יש חברה שיש לה שם ומשרדים ובמשרדים עובדים. רכיבי העובדים והמשרדים הם רכיבי עטיפה - הם משמשים לאיסוף אלמנטים מאותו סוג, ובעצם משלבים אותם לסט אחד כדי להקל על העיבוד. הרצפה והחדר ראויים לתשומת לב מיוחדת. אלו הן התכונות של המשרד (קומה ומספר), במילים אחרות, תכונותיו. אם היה לנו אלמנט "תמונה", אז היינו יכולים להעביר את הממדים שלו. ייתכן שתבחין שלחברה אין תכונת שם, אבל יש לה אלמנט שם. אתה יכול פשוט לתאר מבנים איך שאתה רוצה. אף אחד לא מחייב אותך לכתוב את כל המאפיינים של אלמנטים רק בתכונות; אתה יכול להשתמש רק באלמנטים ולכתוב כמה נתונים בתוכם. לדוגמה, אנו יכולים לרשום את השם והתפקיד של העובדים שלנו כמאפיינים:
<?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 היא טכנולוגיה לאימות מסמכי 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 משמש לתיאור אלמנט. האלמנטים שניתן להשתמש בהם בתוך האלמנט המתואר רשומים בסוגריים בצורת רשימה. ניתן להשתמש במכמתים כדי לציין כמות (הם דומים למכמתים מביטויים רגולריים): +פירושו 1+ *פירושו 0+ ?OR 0אם 1 לא נוספו מכמים, אז ההנחה היא שצריך להיות רק אלמנט אחד. אם היינו צריכים אחד מקבוצת אלמנטים, נוכל לכתוב אותו כך:
<!ELEMENT company ((name | offices))>
לאחר מכן ייבחר אחד המרכיבים: שם או משרדים, אבל אם היו שניים מהם בתוך החברה, אז האימות לא יעבור. אפשר גם לשים לב שבעובד יש את המילה EMPTY - זה אומר שהאלמנט חייב להיות ריק. יש גם ANY - כל אלמנט. #PCDATA - נתוני טקסט. ATTLIST משמש להוספת תכונות לאלמנטים. אחרי ATTLIST עוקב אחר שם האלמנט הרצוי, ואחריו מילון בצורת "שם תכונה - סוג תכונה", ובסוף ניתן להוסיף #IMPLIED (אופציונלי) או #REQUIRED (חובה). CDATA – נתוני טקסט. ישנם סוגים אחרים, אך כולם באותיות קטנות. ENTITY ENTITY משמש להכרזה על קיצורים ועל הטקסט שיוצב עליהם. למעשה, פשוט נוכל להשתמש ב-XML, במקום הטקסט המלא, רק בשם הישות עם סימן & לפני ו-; לאחר. לדוגמה: כדי להבדיל בין סימון HTML לבין תווים בלבד, תופסת הזווית השמאלית מוחלפת לרוב עם lt; , אתה רק צריך לשים & לפני lt. אז לא נשתמש בסימון, אלא פשוט בסמל <. כפי שאתה יכול לראות, הכל די פשוט: אתה מצהיר על אלמנטים, מסביר אילו אלמנטים האלמנטים המוצהרים מסוגלים להכיל, מוסיפים תכונות לאלמנטים הללו ואם רוצים, אתה יכול להוסיף ישויות כדי לקצר כמה ערכים. וכאן תצטרכו לשאול: כיצד להשתמש בכללים שלנו בקובץ ה-XML שלנו? אחרי הכל, פשוט הכרזנו על הכללים, אבל לא השתמשנו בהם ב-XML. ישנן שתי דרכים להשתמש בהן ב-XML: 1. Embedding - כתיבת כללי 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, אך לא סביר שהיא תהיה שימושית עבורך. אם אתה מעוניין, אתה יכול לקרוא על זה (וגם על SYSTEM) בהרחבה כאן: קישור . כעת איננו יכולים להשתמש באלמנטים אחרים מבלי להכריז עליהם ב-DTD, וכל ה-XML כפוף לכללים שלנו. אתה יכול לנסות לכתוב את הקוד הזה ב-IntelliJ IDEA בקובץ נפרד עם סיומת .xml ולנסות להוסיף כמה אלמנטים חדשים או להסיר אלמנט מה-DTD שלנו ולשים לב כיצד ה-IDE יציין בפניך שגיאה. עם זאת, ל- DTD יש את החסרונות שלו:
  • יש לו תחביר משלו, שונה מתחביר xml.
  • ל-DTD אין בדיקת סוגי נתונים והוא יכול להכיל רק מחרוזות.
  • אין מרחב שמות ב-DTD.
לגבי הבעיה של התחביר שלך: עליך להבין שני תחבירים בו-זמנית: תחביר XML ו-DTD. הם שונים וזה עלול לגרום לך לבלבל. כמו כן, בגלל זה, קשה יותר לעקוב אחר שגיאות בקבצי XML ענקיים בשילוב עם אותן סכימות DTD. אם משהו לא עובד בשבילך, אתה צריך לבדוק כמות עצומה של טקסט עם תחבירים שונים. זה כמו לקרוא שני ספרים בו זמנית: ברוסית ובאנגלית. ואם הידע שלך בשפה אחת גרוע יותר, אז הבנת הטקסט תהיה קשה באותה מידה. לגבי הבעיה של בדיקת סוגי נתונים: לתכונות ב-DTD יש סוגים שונים, אבל כולן, בבסיסן, ייצוגי מחרוזת של משהו, רשימות או קישורים. עם זאת, אתה לא יכול לדרוש רק מספרים, ובמיוחד לא חיוביים או שליליים. ואתה יכול לשכוח לחלוטין מסוגי אובייקטים. הבעיה האחרונה תידון במאמר הבא, שיוקדש למרחבי שמות וסכימות XML, שכן הדיון בה כאן הוא חסר טעם. תודה לכולכם על תשומת הלב, עשיתי עבודה רבה ואני ממשיך לעשות אותה כדי לסיים את כל סדרת הכתבות בזמן. בעיקרון, אני רק צריך להבין את סכימות ה-XML ולהמציא הסבר שלהן במילים ברורות יותר כדי לסיים את המאמר השני. חצי מזה כבר נעשה, אז אתה יכול לצפות לזה בקרוב. המאמר האחרון יוקדש כולו לעבודה עם קבצי XML באמצעות Java. בהצלחה לכולם והצלחה בתכנות :) המאמר הבא: [תחרות] יסודות XML למתכנת Java - חלק 2 מתוך 3
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION