JavaRush /Java Blog /Random-ID /Dasar-dasar XML untuk Pemrogram Java. Bagian 2 dari 3
Ярослав
Level 40
Днепр

Dasar-dasar XML untuk Pemrogram Java. Bagian 2 dari 3

Dipublikasikan di grup Random-ID

Perkenalan

Halo, para pembaca artikel saya yang budiman. Ini adalah artikel kedua dalam seri tentang XML, dan artikel ini akan membahas tentang XML Namespace dan XML Schema.
Dasar-dasar XML
Baru-baru ini saya sendiri tidak tahu apa-apa tentang hal ini, namun saya sudah menguasai banyak materi dan akan mencoba menjelaskan kedua topik penting ini dengan kata-kata sederhana. Saya ingin segera mengatakan bahwa skema adalah mekanisme yang sangat canggih untuk memvalidasi dokumen XML dan jauh lebih fungsional daripada DTD, jadi tidak akan ada studi lengkap tentang skema tersebut di sini. Mari kita mulai :)

Ruang Nama XML

Namespace artinya “ruang nama”, namun dalam artikel ini saya akan sering mengganti ekspresi Rusia dengan namespace sederhana, karena lebih pendek dan mudah dipahami. XML Namespace adalah teknologi yang tujuan utamanya adalah memastikan bahwa semua elemen dalam file XML bersifat unik dan tidak ada kebingungan. Dan karena ini adalah kursus Java, teknologi yang sama juga tersedia dalam paket Java. Jika kita dapat menempatkan dua kelas dengan nama yang sama di samping satu sama lain dan menggunakannya, bagaimana kita menentukan kelas mana yang kita perlukan? Masalah ini diselesaikan dengan paket - kita cukup menempatkan kelas dalam paket yang berbeda dan mengimpornya dari sana, menentukan nama pasti dari paket yang diinginkan dan jalur ke sana, atau cukup menentukan jalur lengkap ke kelas yang diinginkan. Dasar-dasar XML untuk Pemrogram Java.  Bagian 2 dari 3 - 1Sekarang, kita dapat melakukan ini:
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();
    }
}
Di XML Namespace semuanya hampir sama, hanya sedikit berbeda. Intinya sama: jika elemennya sama (seperti kelas), maka kita hanya perlu menggunakannya di namespace yang berbeda (tentukan paket), bahkan jika nama elemen (kelas) mulai bertepatan, kita akan tetap melakukannya. mengakses elemen tertentu dari ruang ( paket). Misalnya: kami memiliki dua elemen dalam XML - prediksi (Oracle) dan 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>
Dan ketika kita memproses file XML ini, kita akan sangat bingung jika alih-alih database kita menerima prediksi, dan sebaliknya juga. Untuk mengatasi tumbukan elemen, kita dapat mengalokasikan ruangnya masing-masing elemen untuk membedakannya. Ada atribut khusus untuk ini – xmlns:prefix= “nilai unik untuk namespace”. Kita kemudian dapat mengawali elemen untuk menunjukkan bahwa itu adalah bagian dari namespace tersebut (pada dasarnya, kita harus membuat jalur paket - namespace, dan kemudian mengawali setiap elemen dengan paket mana elemen tersebut berada).
<?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>
Dalam contoh ini, kami telah mendeklarasikan dua namespace: database dan Oracle. Sekarang Anda dapat menggunakan awalan namespace sebelum elemen. Tidak perlu takut jika ada yang belum jelas saat ini. Sebenarnya, ini sangat sederhana. Awalnya saya ingin menulis bagian artikel ini lebih cepat, tetapi setelah hari Rabu saya memutuskan bahwa saya perlu lebih memperhatikan topik ini, karena mudah untuk bingung atau tidak memahami sesuatu. Sekarang banyak perhatian akan diberikan pada atribut xmlns. Jadi, contoh lainnya:
<?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>
Anda dapat melihat XML biasa menggunakan elemen unik space gun for gun store dan elemen unik fish for fishing store. Anda dapat melihat bahwa dengan membuat ruang, kami menggunakan satu elemen toko untuk dua hal berbeda sekaligus - toko senjata dan toko ikan, dan kami tahu persis jenis toko tersebut berkat fakta bahwa kami mendeklarasikan ruang tersebut. Hal yang paling menarik akan dimulai pada skema, ketika kita dapat memvalidasi struktur yang berbeda dengan elemen yang sama dengan cara ini. xmlns adalah atribut untuk mendeklarasikan namespace; itu dapat ditentukan dalam elemen apa pun. Contoh deklarasi namespace:
xmlns:shop= «https://barber-shop.com/»
Setelah titik dua adalah awalan - ini adalah referensi spasi yang kemudian dapat digunakan sebelum elemen untuk menunjukkan bahwa elemen tersebut berasal dari spasi tersebut. Nilai xmlns harus berupa STRING UNIK. Hal ini sangat penting untuk dipahami: sangat umum menggunakan tautan situs web atau URI untuk mendeklarasikan namespace. Aturan ini standar karena URI atau URL tautannya unik, TAPI di sinilah menjadi sangat membingungkan. Ingat saja: nilainya bisa berupa string APAPUN yang Anda inginkan, namun untuk memastikan unik dan standar, Anda perlu menggunakan URL atau URI. Fakta bahwa Anda dapat menggunakan string apa pun ditunjukkan pada contoh di Oracle:
xmlns:oracle="Unique ID #2"
xmlns:database="Unique ID #1"
Saat Anda mendeklarasikan namespace, Anda bisa menggunakannya pada elemen itu sendiri dan semua elemen di dalamnya, sehingga namespace yang dideklarasikan pada elemen root dapat digunakan pada semua elemen. Hal ini dapat dilihat pada contoh terakhir, dan berikut contoh yang lebih 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>
Berikut ini detail penting: ada juga namespace standar di elemen root. Jika Anda mendeklarasikan namespace lain, Anda akan mengganti namespace default dan tidak dapat menggunakannya. Maka Anda perlu meletakkan semacam awalan spasi di depan elemen root, apa pun yang Anda nyatakan sebelumnya. Namun, hal ini juga dapat diakali: Anda dapat mendeklarasikan ruang standar secara eksplisit. Cukup dengan tidak menggunakan awalan setelah xmlns, tetapi segera menuliskan beberapa nilai, dan semua elemen Anda tanpa awalan akan menjadi milik namespace khusus ini. Contoh terakhir menggunakan ini:
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
Kami mendeklarasikan ruang standar secara eksplisit untuk menghindari kebutuhan menggunakan senjata atau ikan, karena elemen akar bukanlah entitas dari toko pemancingan atau senjata, jadi menggunakan salah satu ruang tersebut secara logika salah. Berikutnya: jika Anda membuat xmlns:a dan xmlns:b, tetapi keduanya memiliki nilai yang sama, maka ini adalah ruang yang sama dan tidak unik. Itu sebabnya Anda harus selalu menggunakan nilai unik, karena melanggar aturan ini dapat menyebabkan banyak kesalahan. Misalnya, jika kita mendeklarasikan spasi seperti ini:
xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.gun-shop.com/"
Kemudian toko pancing kita akan menjadi toko senjata, dan awalannya tetap menjadi toko ikan. Ini semua adalah poin utama dari ruang tersebut. Saya menghabiskan cukup banyak waktu untuk mengumpulkan semuanya dan menguranginya, lalu mengungkapkannya dengan jelas, karena informasi tentang ruang di Internet sangat besar dan seringkali hanya air, jadi sebagian besar yang ada di sini - saya mempelajarinya sendiri melalui percobaan dan kesalahan. Jika Anda masih memiliki pertanyaan, Anda bisa mencoba membaca materi menggunakan link di akhir artikel.

Skema XML

Saya ingin segera mengatakan bahwa artikel ini hanya akan menjadi puncak gunung es, karena topiknya sangat luas. Jika Anda ingin mengenal skema lebih detail dan mempelajari cara menulisnya sendiri dengan kerumitan apa pun, maka di akhir artikel akan ada tautan yang semuanya membahas tentang berbagai jenis, batasan, ekstensi, dan sebagainya. Saya ingin memulai dengan teori. Skema memiliki format .xsd (definisi skema xml) dan merupakan alternatif DTD yang lebih canggih dan populer: skema juga dapat membuat elemen, mendeskripsikannya, dan sebagainya. Namun, banyak bonus telah ditambahkan: pengecekan tipe, dukungan namespace, dan fungsionalitas yang lebih luas. Ingat ketika kita berbicara tentang DTD, ada kekurangannya yaitu tidak mendukung spasi? Sekarang setelah kita mempelajarinya, saya akan menjelaskan: jika mungkin untuk mengimpor dua atau lebih skema dari DTD, di mana terdapat elemen yang identik, kita akan mengalami benturan (kebetulan) dan tidak akan dapat menggunakannya sama sekali, karena tidak jelas elemen mana yang kita butuhkan. XSD memecahkan masalah ini karena Anda dapat mengimpor skema ke dalam satu ruang tertentu dan menggunakannya. Pada dasarnya, setiap skema XSD memiliki ruang target, yang berarti di ruang mana skema tersebut harus ditulis dalam file XML. Jadi, dalam file XML itu sendiri, kita hanya perlu membuat ruang-ruang yang telah ditentukan sebelumnya dalam skema dan menetapkan awalan padanya, lalu menghubungkan skema yang diperlukan ke masing-masing ruang, setelah itu kita dapat dengan aman menggunakan elemen dari skema, mengganti awalan dari ruang tempat kami mengimpor skema. Jadi, kita punya contoh:
<?xml version="1.0" encoding="UTF-8"?>
<house>
    <address>ул. Есенина, дом №5</address>
    <owner name="Ivan">
        <telephone>+38-094-521-77-35</telephone>
    </owner>
</house>
Kami ingin memvalidasinya dengan skema. Pertama, kita memerlukan 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>
Seperti yang Anda lihat, skema juga merupakan file XML. Anda menulis apa yang Anda butuhkan langsung dalam XML. Skema ini mampu memvalidasi file XML dari contoh di atas. Misalnya: jika pemiliknya tidak mempunyai nama, sirkuit akan melihatnya. Selain itu, berkat elemen urutan, alamat harus selalu didahulukan, baru kemudian pemilik rumah. Ada unsur biasa dan unsur kompleks. Elemen reguler adalah elemen yang hanya menyimpan beberapa tipe data. Contoh:
<element name="telephone" type="string" />
Ini adalah cara kami mendeklarasikan elemen yang menyimpan string. Seharusnya tidak ada elemen lain di dalam elemen ini. Ada juga elemen yang kompleks. Elemen kompleks mampu menyimpan elemen dan atribut lain di dalamnya. Maka Anda tidak perlu menentukan tipenya, tetapi cukup mulai menulis tipe kompleks di dalam elemen.
<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>
Dimungkinkan juga untuk melakukannya secara berbeda: Anda dapat membuat tipe kompleks secara terpisah, dan kemudian menggantinya ke dalam tipe. Hanya saat menulis contoh ini, karena alasan tertentu perlu mendeklarasikan spasi di bawah beberapa jenis awalan, dan tidak menggunakan yang standar. Secara umum, ternyata seperti ini:
<?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>
Dengan cara ini, kita dapat membuat tipe kita sendiri secara terpisah dan kemudian menggantinya di suatu tempat di atribut type. Ini sangat nyaman karena memungkinkan Anda menggunakan satu jenis di tempat berbeda. Saya ingin berbicara lebih banyak tentang menghubungkan sirkuit dan menyelesaikannya di sini. Ada dua cara untuk menghubungkan suatu rangkaian: ke ruang tertentu dan hanya menyambung.

Cara pertama untuk menghubungkan rangkaian

Metode pertama mengasumsikan bahwa rangkaian memiliki ruang target tertentu. Itu ditentukan menggunakan atribut targetNamespace pada elemen skema. Maka itu cukup untuk membuat ruang yang SAMA INI di file XML, dan kemudian “memuat” skema di sana:
<?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 untuk memahami dua baris:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemeLocation="https://www.nedvigimost.com/ example_schema1.xsd"
Baris pertama - ingatlah saja. Anggap saja sebagai objek yang membantu memuat skema ke tempat yang harus dituju. Baris kedua adalah unduhan khusus. skemaLocation menerima daftar nilai dalam bentuk "nilai - nilai", dipisahkan oleh spasi. Argumen pertama adalah namespace, yang harus cocok dengan namespace target dalam skema (nilai targetNamespace). Argumen kedua adalah jalur relatif atau absolut menuju skema. Dan karena ini adalah nilai LIST, Anda dapat memberi spasi setelah skema pada contoh, dan memasukkan kembali spasi target dan nama skema lain, dan seterusnya sebanyak yang Anda inginkan. Penting:Agar skema dapat memvalidasi sesuatu nanti, Anda perlu mendeklarasikan spasi ini dan menggunakannya dengan awalan. Perhatikan baik-baik contoh terakhir:
<?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>
Kami membuat ruang target ini pada awalan nedvig dan kemudian menggunakannya. Dengan demikian, elemen kami mulai divalidasi, sejak kami mulai menggunakan ruang di mana ruang skema target direferensikan.

Cara kedua untuk menghubungkan rangkaian

Cara kedua untuk menghubungkan suatu rangkaian menyiratkan bahwa rangkaian tersebut tidak memiliki ruang target tertentu. Kemudian Anda cukup menghubungkannya ke file XML dan itu akan memvalidasinya. Ini dilakukan dengan cara yang hampir sama, hanya saja Anda tidak dapat mendeklarasikan spasi sama sekali dalam file XML, tetapi cukup menghubungkan skemanya.
<?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>
Seperti yang Anda lihat, ini dilakukan menggunakan noNamespaceSchemaLocation dan menentukan jalur ke skema. Meskipun skema tidak memiliki ruang target, dokumen akan divalidasi. Dan sentuhan terakhir: kita dapat mengimpor diagram lain ke dalam diagram, dan kemudian menggunakan elemen dari satu diagram ke diagram lainnya. Dengan demikian, kita dapat menggunakan elemen di beberapa rangkaian yang sudah ada di rangkaian lain. Contoh:

Skema dimana tipe pemilik dideklarasikan:

<?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 kedua, yang menggunakan tipe pemilik dari skema pertama:

<?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 kedua menggunakan konstruksi berikut:
<import namespace="bonus" schemaLocation="xsd2.xsd" />
Dengan menggunakannya, kami mengimpor tipe dan elemen dari satu skema ke skema lainnya ke dalam ruang bonus. Jadi, kami memiliki akses ke bonus: tipe pemilik. Dan di baris berikutnya kami menggunakannya:
<element name="owner" type="bonus:owner" />
Juga sedikit perhatian pada baris berikut:
elementFormDefault="qualified"
Atribut ini dideklarasikan dalam skema dan berarti bahwa dalam file XML, setiap elemen harus dideklarasikan dengan awalan eksplisit sebelumnya. Jika tidak ada, maka kita hanya perlu mendeklarasikan elemen eksternal dengan awalan, dan kita juga perlu menyetel awalan di semua elemen di dalamnya, yang dengan jelas menunjukkan bahwa kita menggunakan elemen skema ini dengan tepat. Dan berikut ini adalah contoh file XML yang divalidasi oleh skema yang mengimpor skema lain:
<?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>
Di baris:
<bonus:telephone>+38-094-521-77-35</bonus:telephone>
Kita perlu mendeklarasikan namespace bonus secara eksplisit, yang menunjuk ke ruang target skema pertama, karena elementFormDefault memenuhi syarat (centang), jadi semua elemen harus secara eksplisit menunjukkan ruangnya.

Akhir artikel

Artikel berikutnya akan menjadi yang terakhir dalam seri ini dan akan membahas tentang pemrosesan file XML menggunakan Java. Kita akan belajar memperoleh informasi dengan berbagai cara dan seterusnya. Saya harap artikel ini bermanfaat dan, meskipun ada kesalahan di suatu tempat, artikel ini akan mengajarkan Anda sesuatu yang berguna dan baru, atau mungkin hanya memberi Anda kesempatan untuk lebih memahami file XML. Bagi mereka yang ingin menjelajahi ini lebih detail, saya memutuskan untuk mengumpulkan serangkaian tautan kecil:
  • Elemen Sederhana XSD - mulai dari artikel ini, mulailah membaca dan melanjutkan, semua informasi tentang skema dikumpulkan di sana dan dijelaskan kurang lebih jelas, hanya dalam bahasa Inggris. Anda dapat menggunakan penerjemah.

  • video di namespace, selalu berguna untuk mendengarkan sudut pandang lain tentang sesuatu jika sudut pandang pertama tidak jelas.

  • Namespace XML adalah contoh penggunaan namespace yang bagus dan cukup komprehensif.

  • Dasar-Dasar XML - Ruang Nama - Artikel pendek lainnya tentang ruang nama.

  • Dasar-dasar Menggunakan Skema XML untuk Mendefinisikan Elemen juga merupakan referensi skema yang sangat berguna, tetapi Anda perlu membacanya secara perlahan dan hati-hati, mempelajari materinya.

Itu saja yang pasti, saya harap jika Anda ingin mempelajari lebih dalam dari ini, tautannya akan membantu Anda. Saya sendiri yang mempelajari semua sumber ini, mempelajari semua materi, dan, secara umum, ini adalah sumber yang paling berguna dari semua sumber yang saya lihat, karena masing-masing sumber meningkatkan pemahaman tentang apa yang telah saya baca di tempat lain, atau izinkan saya mempelajari sesuatu yang baru, tetapi banyak yang dilakukan hanya selama latihan. Jadi, bagi yang benar-benar ingin memahami semua ini dengan baik, saran saya adalah: pelajari namespace, lalu cara menghubungkan skema ke file XML dengan mudah, lalu cara menulis struktur dokumen dalam skema. Dan yang paling penting, latihan. Terima kasih atas perhatiannya dan semoga sukses dalam pemrograman :) Artikel sebelumnya: [Kompetisi] Dasar-dasar XML untuk Pemrogram Java - Bagian 1 dari 3 Artikel berikutnya: [Kompetisi] Dasar-dasar XML untuk Pemrogram Java - Bagian 3.1 dari 3 - SAX
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION