JavaRush /Blog Jawa /Random-JV /Dasar XML kanggo Java Programmer. Bagean 2 saka 3
Ярослав
tingkat
Днепр

Dasar XML kanggo Java Programmer. Bagean 2 saka 3

Diterbitake ing grup

Pambuka

Halo, para pembaca artikelku. Iki minangka artikel kapindho ing seri babagan XML, lan artikel iki bakal ngomong babagan XML Namespace lan XML Schema.
Dasar XML
Mung bubar, aku dhewe ora ngerti babagan iki, nanging aku wis nguwasani akeh materi lan bakal nyoba nerangake rong topik penting iki kanthi tembung sing gampang. Aku pengin langsung ngomong yen skema minangka mekanisme sing luwih maju kanggo validasi dokumen XML lan luwih fungsional tinimbang DTD, mula ora ana studi lengkap babagan iki ing kene. Ayo miwiti :)

Ruang Jeneng XML

Namespace tegese "spasi jeneng", nanging ing artikel iki aku kerep ngganti ekspresi Rusia kanthi spasi jeneng, amarga luwih cendhek lan luwih gampang dingerteni. XML Namespace minangka teknologi sing tujuane utamane yaiku kanggo mesthekake yen kabeh unsur unik ing file XML lan ora ana kebingungan. Lan amarga iki minangka kursus Jawa, teknologi sing padha uga kasedhiya ing paket Jawa. Yen kita bisa nyelehake rong kelas kanthi jeneng sing padha ing jejere lan digunakake, kepiye carane nemtokake kelas sing dibutuhake? Masalah iki ditanggulangi dening paket - kita mung bisa manggonake kelas ing paket beda lan ngimpor saka ing kono, nemtokake jeneng pas paket dikarepake lan path menyang, utawa mung nemtokake path lengkap kanggo kelas dikarepake. Dasar XML kanggo Java Programmer.  Bagean 2 saka 3-1Saiki, kita bisa nindakake iki:
public class ExampleInvocation {
    public static void main(String[] args) {
        // Creation экземпляра класса из первого пакета.
        example_package_1.Example example1 = new example_package_1.Example();

        // Creation экземпляра класса из второго пакета.
        example_package_2.Example example2 = new example_package_2.Example();

        // Creation экземпляра класса из третьего пакета.
        example_package_3.Example example3 = new example_package_3.Example();
    }
}
Ing XML Namespace kabeh meh padha, mung beda sethitik. Intine padha: yen unsur-unsur kasebut padha (kaya kelas), mula kita kudu nggunakake ing ruang jeneng sing beda-beda (nemtokake paket), banjur sanajan jeneng unsur (kelas) wiwit pas, kita bakal tetep. ngakses unsur tartamtu saka spasi (paket). Contone: kita duwe rong unsur ing XML - prediksi (oracle) lan database Oracle.
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <oracle>
        <connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
        <user value="root" />
        <password value="111" />
    </oracle>

    <oracle>
        Сегодня вы будете заняты весь день.
    </oracle>
</root>
Lan nalika kita proses file XML iki, kita bakal akeh bingung yen tinimbang database kita nampa prediksi, lan uga bali. Supaya kanggo mutusake masalah tabrakan unsur, kita bisa nyedhiakke saben wong papan dhewe kanggo mbedakake antarane wong-wong mau. Ana atribut khusus kanggo iki - xmlns: prefix = "nilai unik kanggo ruang jeneng". Kita banjur bisa ater-ater unsur kanggo nunjukaké sing iku bagéan saka namespace (intine, kita kudu nggawe path paket - namespace, lan banjur ater-ater saben unsur karo kang paket belongs kanggo).
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <database:oracle xmlns:database="Unique ID #1">
        <connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
        <user value="root" />
        <password value="111" />
    </database:oracle>

    <oracle:oracle xmlns:oracle="Unique ID #2">
        Сегодня вы будете заняты весь день.
    </oracle:oracle>
</root>
Ing conto iki, kita wis ngumumake rong ruang jeneng: database lan oracle. Saiki sampeyan bisa nggunakake prefiks namespace sadurunge unsur. Ora perlu wedi yen ana sing ora jelas saiki. Ing kasunyatan, iku banget prasaja. Kaping pisanan, aku pengin nulis bagean artikel iki kanthi luwih cepet, nanging sawise dina Rebo aku mutusake yen aku kudu menehi perhatian luwih akeh babagan topik iki, amarga gampang bingung utawa ora ngerti apa-apa. Saiki akeh perhatian bakal dibayar kanggo atribut xmlns. Dadi, conto liyane:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
    <gun:shop>
        <gun:guns>
            <gun:gun name="Revolver" price="1250$" max_ammo="7" />
            <gun:gun name="M4A1" price="3250$" max_ammo="30" />
            <gun:gun name="9mm Pistol" price="450$" max_ammo="12" />
        </gun:guns>
    </gun:shop>

    <fish:shop>
        <fish:fishes>
            <fish:fish name="Shark" price="1000$" />
            <fish:fish name="Tuna" price="5$" />
            <fish:fish name="Capelin" price="1$" />
        </fish:fishes>
    </fish:shop>
</root>
Sampeyan bisa ndeleng XML biasa nggunakake bedhil spasi kanggo nyimpen gun unsur unik lan iwak kanggo nyimpen fishing unsur unik. Sampeyan bisa ndeleng manawa kanthi nggawe spasi, kita nggunakake siji unsur toko kanggo rong perkara sing beda-beda - toko senjata lan toko iwak, lan kita ngerti persis apa jenis toko kasebut amarga nyatane nyatakake spasi kasebut. Sing paling menarik bakal diwiwiti ing skema, nalika kita bakal bisa ngesyahke struktur sing beda karo unsur sing padha kanthi cara iki. xmlns minangka atribut kanggo nyatakake spasi jeneng; bisa ditemtokake ing unsur apa wae. Conto deklarasi namespace:
xmlns:shop= «https://barber-shop.com/»
Sawise titik loro minangka ater-ater - iki minangka referensi spasi sing banjur bisa digunakake sadurunge unsur kanggo nunjukake yen asale saka spasi kasebut. Nilai xmlns kudu STRING UNIK. Iki penting banget kanggo dimangerteni: umume nggunakake tautan situs web utawa URI kanggo ngumumake ruang jeneng. Aturan iki standar amarga URI utawa URL link kasebut unik, nanging ing kene dadi mbingungake. Cukup elinga: nilai kasebut bisa dadi ANY string sing dikarepake, nanging kanggo mesthekake unik lan standar, sampeyan kudu nggunakake URL utawa URI. Kasunyatan manawa sampeyan bisa nggunakake senar apa wae ditampilake ing conto ing oracle:
xmlns:oracle="Unique ID #2"
xmlns:database="Unique ID #1"
Nalika sampeyan ngumumake spasi jeneng, sampeyan bisa nggunakake ing unsur dhewe lan ing kabeh unsur ing, supaya namespaces diumumake ing unsur ROOT bisa digunakake ing kabeh unsur. Iki bisa dideleng ing conto pungkasan, lan ing ngisor iki conto sing luwih spesifik:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <el1:element1 xmlns:el1="Element#1 Unique String">
        <el1:innerElement>

        </el1:innerElement>
    </el1:element1>


    <el2:element2 xmlns:el2="Element#2 Unique String">
        <el2:innerElement>

        </el2:innerElement>
    </el2:element2>


    <el3:element3 xmlns:el3="Element#3 Unique String">
        <el3:innerElement>
            <el1:innerInnerElement> <!-- Так нельзя, потому что пространство el1 объявлено только в первом элементе, потому может использовать только внутри первого element и его внутренних элементов. -->

            </el1:innerInnerElement>
        </el3:innerElement>
    </el3:element3>
</root>
Punika rincian penting: ana uga spasi jeneng standar ing unsur ROOT. Yen sampeyan ngumumake spasi jeneng liyane, sampeyan bakal ngganti sing standar lan ora bisa digunakake. Banjur sampeyan kudu nglebokake sawetara ater-ater spasi ing ngarepe unsur oyod, apa wae sing wis diumumake sadurunge. Nanging, iki uga bisa diapusi: sampeyan bisa ngumumake spasi standar kanthi tegas. Cukup ora nggunakake ater-ater sawise xmlns, nanging langsung nulis sawetara nilai, lan kabeh unsur sampeyan tanpa ater-ater bakal kalebu ing namespace tartamtu iki. Conto pungkasan nggunakake iki:
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
We ngumumake papan standar kanthi tegas supaya ora perlu nggunakake bedhil utawa iwak, amarga unsur oyot ora dadi entitas toko utawa senjata, mula nggunakake papan kasebut ora logis. Sabanjure: yen sampeyan nggawe xmlns:a lan xmlns:b, nanging padha duwe nilai sing padha, banjur iki spasi padha lan padha ora unik. Mulane sampeyan kudu tansah nggunakake nilai unik, amarga nglanggar aturan iki bisa nggawe nomer akeh kasalahan. Contone, yen kita duwe spasi sing diumumake kaya iki:
xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.gun-shop.com/"
Banjur toko nelayan kita bakal dadi toko senjata, lan awalan isih dadi toko iwak. Iki kabeh titik utama spasi. Aku ngenteni cukup akeh wektu kanggo ngumpulake kabeh lan nyuda, banjur nyatakake kanthi jelas, amarga informasi babagan spasi ing Internet akeh banget lan asring mung banyu, mula kabeh sing ana ing kene - aku sinau dhewe liwat nyoba. lan kesalahan. Yen sampeyan isih duwe pitakon, sampeyan bisa nyoba maca materi nggunakake tautan ing pungkasan artikel.

Skema XML

Aku arep ngomong langsung yen artikel iki mung bakal dadi puncak gunung es, amarga topik kasebut amba banget. Yen sampeyan pengin ngerti skema kanthi luwih rinci lan sinau carane nulis dhewe saka kerumitan apa wae, banjur ing pungkasan artikel bakal ana link ing ngendi kabeh bakal ana macem-macem jinis, watesan, ekstensi, lan liya-liyane. Aku pengin miwiti karo teori. Skema duwe format .xsd (definisi skema xml) lan minangka alternatif sing luwih maju lan populer kanggo DTD: uga bisa nggawe unsur, nggambarake, lan liya-liyane. Nanging, akeh bonus sing ditambahake: mriksa jinis, dhukungan papan jeneng lan fungsi sing luwih akeh. Elinga nalika kita ngomong babagan DTD, ana minus sing ora ndhukung spasi? Saiki kita wis sinau iki, aku bakal nerangake: yen bisa ngimpor loro utawa luwih skema saka DTD, ing ngendi ana unsur sing padha, kita bakal duwe tabrakan (kebetulan) lan ora bakal bisa digunakake, amarga ora jelas unsur sing dibutuhake. XSD ngatasi masalah iki amarga sampeyan bisa ngimpor skema menyang papan tartamtu lan nggunakake. Ateges, saben skema XSD nduweni spasi target, sing tegese spasi skema kasebut kudu ditulis ing file XML. Mangkono, ing file XML dhewe, kita mung kudu nggawe spasi iki wis ditemtokake ing skema lan nemtokake prefiks kanggo wong-wong mau, lan banjur nyambungake skema sing perlu kanggo saben wong, sawise kang bisa aman nggunakake unsur saka skema, ngganti ater-ater saka. papan ing ngendi kita ngimpor skema. Dadi, kita duwe conto:
<?xml version="1.0" encoding="UTF-8"?>
<house>
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</house>
Kita pengin validasi kanthi skema. Pisanan, kita butuh skema:
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.nedvigimost.com/">
    <element name="house">
        <complexType>
            <sequence>
                <element name="address" type="string" maxOccurs="unbounded" minOccurs="0" />
                <element name="owner" maxOccurs="unbounded" minOccurs="0" >
                    <complexType>
                        <sequence>
                            <element name="telephone" type="string" />
                        </sequence>
                        <attribute name="name" type="string" use="required"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>
Kaya sing sampeyan ngerteni, skema uga file XML. Sampeyan nulis apa sing perlu langsung ing XML. Skema iki bisa validasi file XML saka conto ing ndhuwur. Contone: yen pemilik ora duwe jeneng, sirkuit bakal weruh iki. Uga, thanks kanggo unsur urutan alamat kudu tansah teka pisanan, lan banjur pemilik saka omah. Ana unsur biasa lan kompleks. Unsur reguler yaiku unsur sing mung nyimpen sawetara jinis data. Tuladha:
<element name="telephone" type="string" />
Iki carane kita ngumumake unsur sing nyimpen senar. Mesthine ora ana unsur liya ing njero unsur iki. Ana uga unsur kompleks. Unsur Komplek bisa nyimpen unsur lan atribut liyane ing awake dhewe. Banjur sampeyan ora perlu kanggo nemtokake jinis, nanging mung miwiti nulis jinis Komplek nang unsur.
<complexType>
    <sequence>
        <element name="address" type="string" maxOccurs="unbounded" minOccurs="0" />
        <element name="owner" maxOccurs="unbounded" minOccurs="0" >
            <complexType>
                <sequence>
                    <element name="telephone" type="string" />
                </sequence>
                <attribute name="name" type="string" use="required"/>
            </complexType>
        </element>
    </sequence>
</complexType>
Sampeyan uga bisa nindakake kanthi cara sing beda: sampeyan bisa nggawe jinis kompleks kanthi kapisah, banjur ngganti dadi jinis. Mung nalika nulis conto iki, sakperangan alesan iku perlu kanggo wara-wara spasi ing sawetara jinis awalan, lan ora nggunakake standar. Umumé, ternyata kaya iki:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.nedvigimost.com/">
    <xs:element name="house" type="content" />

    <xs:complexType name="content">
        <xs:sequence>
            <xs:element name="address" type="xs:string" maxOccurs="unbounded" minOccurs="0" />
            <xs:element name="owner" maxOccurs="unbounded" minOccurs="0" >
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="telephone" type="xs:string" />
                    </xs:sequence>
                    <xs:attribute name="name" type="xs:string" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
Kanthi cara iki, kita bisa nggawe jinis dhewe kanthi kapisah lan banjur ngganti ing endi wae ing atribut jinis. Iki trep banget amarga ngidini sampeyan nggunakake siji jinis ing macem-macem papan. Aku kaya kanggo pirembagan liyane babagan nyambungake sirkuit lan rampung kene. Ana rong cara kanggo nyambungake sirkuit: menyang papan tartamtu lan mung nyambung.

Cara pisanan kanggo nyambungake sirkuit

Cara pisanan nganggep yen sirkuit nduweni spasi target tartamtu. Ditemtokake nggunakake atribut targetNamespace ing unsur skema. Banjur cukup kanggo nggawe papan sing padha ing file XML, banjur "muat" skema kasebut ing kana:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="https://www.nedvigimost.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.nedvigimost.com/ example_schema1.xsd">
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</nedvig:house>
Penting kanggo ngerti rong baris:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemeLocation="https://www.nedvigimost.com/ example_schema1.xsd"
Baris pisanan - mung elinga. Mikir minangka obyek sing mbantu mbukak skema menyang ngendi wae. Baris kapindho minangka undhuhan khusus. schemaLocation nampa dhaptar nilai saka wangun "nilai - nilai", dipisahake dening spasi. Argumentasi pisanan yaiku ruang jeneng, sing kudu cocog karo ruang jeneng target ing skema (nilai targetNamespace). Argumentasi kapindho yaiku path relatif utawa absolut menyang skema. Lan amarga iki minangka nilai LIST, sampeyan bisa nyelehake spasi sawise skema ing conto, lan maneh ngetik spasi target lan jeneng skema liyane, lan sateruse kaya sing dikarepake. penting:Supaya skema bisa ngvalidasi soko mengko, sampeyan kudu ngumumake spasi iki lan nggunakake ater-ater. Deleng kanthi teliti ing conto pungkasan:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="https://www.nedvigimost.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.nedvigimost.com/ example_schema1.xsd">
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</nedvig:house>
Kita nggawe papan target iki ing awalan nedvig banjur digunakake. Mangkono, unsur kita wiwit divalidasi, amarga kita wiwit nggunakake spasi ing ngendi spasi skema target dirujuk.

Cara liya kanggo nyambungake sirkuit

Cara liya kanggo nyambungake sirkuit nuduhake manawa sirkuit kasebut ora duwe papan target tartamtu. Banjur sampeyan mung bisa nyambung menyang file XML lan bakal validasi. Iki rampung kanthi cara sing padha, mung sampeyan ora bisa ngumumake spasi ing file XML, nanging mung nyambungake skema kasebut.
<?xml version="1.0" encoding="UTF-8"?>
<house xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="example_schema1.xsd">
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</house>
Minangka sampeyan bisa ndeleng, iki rampung nggunakake noNamespaceSchemaLocation lan nemtokake path menyang skema. Sanajan skema kasebut ora duwe ruang target, dokumen kasebut bakal divalidasi. Lan tutul pungkasan: kita bisa ngimpor diagram liyane menyang diagram, lan banjur nggunakake unsur saka siji diagram ing liyane. Mangkono, kita bisa nggunakake unsur ing sawetara sirkuit sing wis ana ing liyane. Tuladha:

Skema ing ngendi jinis pemilik diumumake:

<?xml version="1.0" encoding="UTF-8" ?>
<schema targetNamespace="bonus" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
        <complexType name="owner">
            <all>
                <element name="telephone" type="string" />
            </all>
            <attribute name="name" type="string" />
        </complexType>
</schema>

Skema kapindho, sing nggunakake jinis pemilik saka skema pisanan:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="main" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:bonus="bonus" elementFormDefault="qualified">
    <import namespace="bonus" schemaLocation="xsd2.xsd" />
    <element name="house">
        <complexType>
            <all>
              <element name="address" type="string" />
                <element name="owner" type="bonus:owner" />
            </all>
        </complexType>
    </element>
</schema>
Skema kapindho nggunakake konstruksi ing ngisor iki:
<import namespace="bonus" schemaLocation="xsd2.xsd" />
Nggunakake, kita ngimpor jinis lan unsur saka siji skema menyang liyane menyang papan bonus. Mangkono, kita duwe akses menyang bonus:jinis pemilik. Lan ing baris sabanjure kita nggunakake:
<element name="owner" type="bonus:owner" />
Uga perhatian sethithik marang baris ing ngisor iki:
elementFormDefault="qualified"
Atribut iki diumumake ing skema lan tegese ing file XML, saben unsur kudu diumumake kanthi prefiks eksplisit sadurunge. Yen ora ana, mula kita mung kudu ngumumake unsur eksternal kanthi awalan, lan kita uga kudu nyetel awalan ing kabeh unsur ing njero, kanthi jelas nuduhake yen kita nggunakake unsur-unsur skema iki. Lan ing kene, nyatane, minangka conto file XML sing divalidasi dening skema sing ngimpor skema liyane:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="main" xmlns:bonus="bonus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="main xsd.xsd">
    <nedvig:address>ул. Есенина, дом №5</nedvig:address>
    <nedvig:owner name="Ivan">
        <bonus:telephone>+38-094-521-77-35</bonus:telephone>
    </nedvig:owner>
</nedvig:house>
Ing baris:
<bonus:telephone>+38-094-521-77-35</bonus:telephone>
Kita kudu nyatakake spasi jeneng bonus kanthi jelas, sing nuduhake spasi target skema pisanan, amarga elementFormDefault nduweni kualifikasi (mriksa), supaya kabeh unsur kudu kanthi jelas nuduhake papan kasebut.

Pungkasan artikel

Artikel sabanjure bakal dadi sing pungkasan ing seri kasebut lan bakal ngolah file XML nggunakake Java. Kita bakal sinau kanggo entuk informasi kanthi cara sing beda-beda lan liya-liyane. Muga-muga artikel iki migunani lan, sanajan ana kesalahan ing endi wae, bakal mulang sampeyan babagan sing migunani lan anyar, utawa mung menehi kesempatan kanggo luwih ngerti file XML. Kanggo sing pengin njelajah iki kanthi luwih rinci, aku mutusake nggawe link cilik:
  • Unsur Sederhana XSD - wiwit saka artikel iki, wiwiti maca lan maju, kabeh informasi babagan skema diklumpukake ing kana lan diterangake luwih utawa kurang cetha, mung ing basa Inggris. Sampeyan bisa nggunakake penerjemah.

  • video ing namespaces, iku tansah migunani kanggo ngrungokake sudut pandang liyane ing soko yen pisanan ora cetha.

  • Namespace XML minangka conto sing apik babagan panggunaan spasi jeneng lan cukup lengkap.

  • Dasar XML - Ruang Jeneng - Artikel cekak liyane babagan ruang jeneng.

  • Dasar Nggunakake Skema XML kanggo Nemtokake Unsur uga minangka referensi sing migunani banget babagan skema, nanging sampeyan kudu maca kanthi alon lan kanthi ati-ati, nyinaoni materi kasebut.

Sing mesthi wae, muga-muga yen sampeyan pengin sinau luwih jero saka iki, tautan kasebut bakal mbantu sampeyan. Kabeh sumber kasebut dakkarepake dhewe, sinau kabeh materi, lan, umume, iki minangka sumber sing paling migunani saka kabeh sumber sing dakdeleng, amarga saben sumber bisa nambah pemahaman babagan apa sing wis dakwaca ing papan liya, utawa Ayo kula sinau sing anyar, nanging akeh sing ditindakake mung sajrone latihan. Dadi, kanggo wong-wong sing pengin ngerti kabeh iki kanthi becik, saranku yaiku: sinau spasi jeneng, banjur carane gampang nyambungake skema menyang file XML, banjur carane nulis struktur dokumen ing skema. Lan sing paling penting, latihan. Matur nuwun kabeh kanggo perhatian lan sukses ing pemrograman :) Artikel sadurunge: [Kompetisi] Dasar XML kanggo Programmer Java - Part 1 saka 3 Artikel sabanjure: [Kompetisi] Dasar XML kanggo Programmer Java - Part 3.1 saka 3 - SAX
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION