JavaRush /Java Blog /Random-TL /Mga Pangunahing Kaalaman sa XML para sa Java Programmer. ...
Ярослав
Antas
Днепр

Mga Pangunahing Kaalaman sa XML para sa Java Programmer. Bahagi 3.2 ng 3 - DOM

Nai-publish sa grupo
<h2>Panimula</h2>Kumusta sa lahat ng mga mambabasa ng artikulo, ang bahaging ito ay nakatuon sa DOM. Ang susunod ay ilalaan sa JAXB at, kasama nito, ang cycle ng XML basics ay makukumpleto. Una magkakaroon ng kaunting teorya, at pagkatapos ay pagsasanay lamang. Magsimula na tayo. <h2>DOM (Document Object Model) - THEORY</h2>Ang DOM handler ay idinisenyo sa paraang binabasa nito ang lahat ng XML nang sabay-sabay at ini-save ito, na lumilikha ng hierarchy sa anyo ng isang puno kung saan madali nating maililipat at i-access ang mga elemento na kailangan namin. Kaya, maaari nating makuha ang lahat ng mga link sa mga panloob na elemento, na binigyan ng isang link sa tuktok na elemento. Bukod dito, ang mga elemento na nasa loob ng elemento ay ang mga anak ng elementong ito, at ito ang kanilang magulang. Kapag nabasa na namin ang lahat ng XML sa memorya, lakbayin lang namin ang istraktura nito at gagawin ang mga aksyon na kailangan namin. Kaunti tungkol sa bahagi ng programming ng DOM sa Java: ang DOM ay may maraming mga interface na nilikha upang ilarawan ang iba't ibang data. Ang lahat ng mga interface na ito ay nagmamana ng isang karaniwang interface - Node. Dahil, sa katunayan, ang pinakakaraniwang uri ng data sa DOM ay ang Node, na maaaring kahit ano. Ang bawat Node ay may mga sumusunod na kapaki-pakinabang na pamamaraan para sa pagkuha ng impormasyon:
  1. getNodeName– kunin ang pangalan ng host.
  2. getNodeValue– makuha ang halaga ng node.
  3. getNodeType– kunin ang uri ng node.
  4. getParentNode– kunin ang node kung saan matatagpuan ang ibinigay na node.
  5. getChildNodes– makuha ang lahat ng mga nagmula na node (mga node na nasa loob ng isang ibinigay na node).
  6. getAttributes– makuha ang lahat ng katangian ng node.
  7. getOwnerDocument– kunin ang dokumento ng node na ito.
  8. getFirstChild/getLastChild– makuha ang una/huling nagmula na node.
  9. getLocalName– kapaki-pakinabang kapag nagpoproseso ng mga namespace para makakuha ng pangalan nang walang prefix.
  10. getTextContent– ibinabalik ang lahat ng teksto sa loob ng isang elemento at lahat ng mga elemento sa loob ng isang partikular na elemento, kabilang ang mga line break at espasyo.
Tandaan sa paraan 9: ito ay palaging magbabalik ng null maliban kung ginamit mo ang setNamespaceAware(true) na pamamaraan sa DocumentFactory upang ma-trigger ang pagproseso ng namespace. Ngayon, isang mahalagang detalye: ang mga pamamaraan ay karaniwan sa lahat ng Node, ngunit sa Node maaari tayong magkaroon ng parehong elemento at katangian. At narito ang mga tanong: ano ang halaga ng isang elemento? Anong mga derived node ang maaaring magkaroon ng attribute? At ang iba ay hindi pare-pareho. At ang lahat ay medyo simple: ang bawat pamamaraan ay gagana depende sa uri ng Node . Ito ay sapat na upang gumamit ng lohika, siyempre, upang hindi malito. Halimbawa: anong mga katangian ang kayang taglayin ng mga katangian? Ano ang iba pang kahulugan ng elemento? Gayunpaman, upang hindi subukan ang lahat sa iyong sarili, sa mga opisyal na doc mayroong isang napaka-kapaki-pakinabang na talahanayan kung paano gumagana ang bawat pamamaraan depende sa uri ng Node: Ang kalidad ay naging masama, kaya narito ang isang link sa dokumentasyon (talahanayan sa sa tuktok ng pahina): Dokumentasyon ng Node Ang pinakamahalagang bagay na dapat tandaan:
  1. LAMANG ang mga elemento ay may mga katangian.
  2. Ang mga elemento ay WALANG kahulugan.
  3. Ang pangalan ng element node ay kapareho ng pangalan ng tag, at ang pangalan ng attribute node ay kapareho ng pangalan ng attribute.
<h2>DOM (Document Object Model) - PRACTICE</h2>Sa praktikal na bahagi, susuriin namin ang iba't ibang uri ng mga gawain sa paghahanap ng impormasyon sa XML. Kumuha din kami ng dalawang gawain mula sa nakaraang artikulo upang ihambing ang kaginhawahan. Magsimula tayo, at magandang magsimula sa mga pag-import:
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
Nagbibigay ako ng mga pag-import upang hindi mo malito ang mga klase :) Gawain Blg. 1 - kailangan nating kumuha ng impormasyon tungkol sa lahat ng empleyado at i-output ito sa console mula sa sumusunod na XML file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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>
Tulad ng nakikita natin, mayroon tayong lahat ng impormasyon na nakaimbak sa mga elemento ng empleyado. Upang maimbak ito sa isang lugar sa aming programa, gumawa tayo ng isang klase Employee:
public class Employee {
    private String name, job;

    public Employee(String name, String job) {
        this.name = name;
        this.job = job;
    }

    public String getName() {
        return name;
    }

    public String getJob() {
        return job;
    }
}
Ngayon na mayroon na kaming paglalarawan ng istraktura para sa pag-iimbak ng data, kailangan namin ng isang koleksyon na mag-iimbak ng mga empleyado. Gagawin namin ito sa mismong code. Kailangan din naming lumikha ng isang Dokumento batay sa aming XML:
public class DOMExample {
    // Список для сотрудников из XML file
    private static ArrayList<Employee> employees = new ArrayList<>();

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        // Получение фабрики, чтобы после получить билдер documentов.
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        // Получor из фабрики билдер, который парсит XML, создает структуру Document в виде иерархического дерева.
        DocumentBuilder builder = factory.newDocumentBuilder();

        // Запарсor XML, создав структуру Document. Теперь у нас есть доступ ко всем elementм, Howим нам нужно.
        Document document = builder.parse(new File("resource/xml_file1.xml"));
    }
}
Kapag natanggap na namin ang dokumento, mayroon kaming walang limitasyong kapangyarihan sa buong istraktura ng XML file. Maaari kaming kumuha ng anumang elemento anumang oras, bumalik upang suriin ang anumang data at, sa pangkalahatan, isang mas nababaluktot na diskarte kaysa sa SAX. Sa konteksto ng gawaing ito, kailangan lang nating kunin ang lahat ng elemento ng empleyado, at pagkatapos ay kunin ang lahat ng impormasyon tungkol sa kanila. Ito ay medyo simple:
public class DOMExample {
    // Список для сотрудников из XML file
    private static ArrayList<Employee> employees = new ArrayList<>();

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        // Получение фабрики, чтобы после получить билдер documentов.
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        // Получor из фабрики билдер, который парсит XML, создает структуру Document в виде иерархического дерева.
        DocumentBuilder builder = factory.newDocumentBuilder();

        // Запарсor XML, создав структуру Document. Теперь у нас есть доступ ко всем elementм, Howим нам нужно.
        Document document = builder.parse(new File("resource/xml_file1.xml"));

        // Получение списка всех элементов employee внутри корневого element (getDocumentElement возвращает ROOT элемент XML file).
        NodeList employeeElements = document.getDocumentElement().getElementsByTagName("employee");

        // Перебор всех элементов employee
        for (int i = 0; i < employeeElements.getLength(); i++) {
            Node employee = employeeElements.item(i);

            // Получение атрибутов каждого element
            NamedNodeMap attributes = employee.getAttributes();

            // Добавление сотрудника. Атрибут - тоже Node, потому нам нужно получить meaning атрибута с помощью метода getNodeValue()
            employees.add(new Employee(attributes.getNamedItem("name").getNodeValue(), attributes.getNamedItem("job").getNodeValue()));
        }

        // Вывод информации о каждом сотруднике
        for (Employee employee : employees)
            System.out.println(String.format("Информации о сотруднике: Name - %s, должность - %s.", employee.getName(), employee.getJob()));
    }
}
Ang paglalarawan ng solusyon na ito ay tama sa solusyon. Maipapayo, pagkatapos tingnan ang code, na bumalik sa teorya at basahin itong muli. Sa katunayan, ang lahat ay malinaw nang katutubo. Basahin ng mabuti ang mga komento at hindi dapat magkaroon ng anumang mga katanungan, at kung mayroon man, maaari kang sumulat sa mga komento, sasagutin ko, o sa link, o patakbuhin ang iyong IDEA at subukang laruin ang code sa iyong sarili kung hindi mo pa nagagawa. Kaya pagkatapos patakbuhin ang code nakuha namin ang sumusunod na output:
Информации о сотруднике: Name - Maksim, должность - Middle Software Developer.
Информации о сотруднике: Name - Ivan, должность - Junior Software Developer.
Информации о сотруднике: Name - Franklin, должность - Junior Software Developer.
Информации о сотруднике: Name - Herald, должность - Middle Software Developer.
Информации о сотруднике: Name - Adam, должность - Middle Software Developer.
Информации о сотруднике: Name - Leroy, должность - Junior Software Developer.
Tulad ng nakikita mo, matagumpay na nakumpleto ang gawain! Lumipat tayo sa susunod na gawain :) Gawain No. 2 - ang pangalan ng isang elemento ay ipinasok mula sa console, tungkol sa kung saan kailangan mong magpakita ng impormasyon tungkol sa lahat ng mga elemento sa loob nito at ang kanilang mga katangian mula sa sumusunod na XML file:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <oracle>
        <connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
        <user value="secretOracleUsername" />
        <password value="111" />
    </oracle>

    <mysql>
        <connection value="jdbc:mysql:thin:@10.220.140.48:1521:test1" />
        <user value="secretMySQLUsername" />
        <password value="222" />
    </mysql>
</root>
Ang lahat ay medyo simple: dapat nating makuha ang elemento sa pamamagitan ng pangalan nito, na binibilang natin, at pagkatapos ay dumaan sa lahat ng mga node ng bata. Upang gawin ito, kailangan mong umulit sa lahat ng mga node ng bata ng lahat ng mga node ng bata na mga elemento. Solusyon sa problemang ito:
public class DOMExample {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        // Ридер для считывания имени тега из консоли
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // Получение фабрики, чтобы после получить билдер documentов.
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        // Получor из фабрики билдер, который парсит XML, создает структуру Document в виде иерархического дерева.
        DocumentBuilder builder = factory.newDocumentBuilder();

        // Запарсor XML, создав структуру Document. Теперь у нас есть доступ ко всем elementм, Howим нам нужно.
        Document document = builder.parse(new File("resource/xml_file3.xml"));

        // Считывание имени тега для поиска его в файле
        String element = reader.readLine();

        // Получение списка элементов, однако для удобства будем рассматривать только первое совпадение в documentе.
        // Так же заметьте, что мы ищем элемент внутри documentа, а не рут element. Это сделано для того, чтобы рут элемент тоже искался.
        NodeList matchedElementsList = document.getElementsByTagName(element);

        // Даже если element нет, всегда будет возвращаться список, просто он будет пустым.
        // Потому, чтобы утверждать, что element нет в файле, достаточно проверить размер списка.
        if (matchedElementsList.getLength() == 0) {
            System.out.println("Tag " + element + " не был найден в файле.");
        } else {
            // Получение первого element.
            Node foundedElement = matchedElementsList.item(0);

            System.out.println("Элемент был найден!");

            // Если есть данные внутри, вызов метода для вывода всей информации
            if (foundedElement.hasChildNodes())
                printInfoAboutAllChildNodes(foundedElement.getChildNodes());
        }
    }

    /**
     * Рекурсивный метод, который будет выводить информацию про все узлы внутри всех узлов, которые пришли параметром, пока не будут перебраны все узлы.
     * @param list Список узлов.
     */
    private static void printInfoAboutAllChildNodes(NodeList list) {
        for (int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);

            // У элементов есть два вида узлов - другие элементы or текстовая информация. Потому нужно разбираться две ситуации отдельно.
            if (node.getNodeType() == Node.TEXT_NODE) {
                // Фильтрация информации, так How пробелы и переносы строчек нам не нужны. Это не информация.
                String textInformation = node.getNodeValue().replace("\n", "").trim();

                if(!textInformation.isEmpty())
                    System.out.println("Внутри element найден текст: " + node.getNodeValue());
            }
            // Если это не текст, а элемент, то обрабатываем его How элемент.
            else {
                System.out.println("Найден элемент: " + node.getNodeName() + ", его атрибуты:");

                // Получение атрибутов
                NamedNodeMap attributes = node.getAttributes();

                // Вывод информации про все атрибуты
                for (int k = 0; k < attributes.getLength(); k++)
                    System.out.println("Name атрибута: " + attributes.item(k).getNodeName() + ", его meaning: " + attributes.item(k).getNodeValue());
            }

            // Если у данного element еще остались узлы, то вывести всю информацию про все его узлы.
            if (node.hasChildNodes())
                printInfoAboutAllChildNodes(node.getChildNodes());
        }
    }
}
Ang buong paglalarawan ng solusyon ay nasa mga komento, ngunit nais kong ilarawan nang kaunti graphically ang diskarte na ginamit namin, gamit ang isang halimbawa mula sa isang larawan mula sa teorya. Ipagpalagay namin na kailangan naming magpakita ng impormasyon tungkol sa html tag. Tulad ng nakikita mo, kailangan nating pumunta mula sa itaas hanggang sa ibaba mula sa ugat ng puno. Ang lahat ng mga linya ay mga node. Sa solusyon, kami ay recursively pumunta mula sa simula ng nais na elemento sa lahat ng mga node nito, at kung ang isa sa mga node nito ay isang elemento, pagkatapos ay umuulit din kami sa lahat ng mga node ng elementong ito. Kaya pagkatapos patakbuhin ang code nakuha namin ang sumusunod na output para sa elemento ng ugat:
Элемент был найден!
Найден элемент: oracle, его атрибуты:
Найден элемент: connection, его атрибуты:
Name атрибута: value, его meaning: jdbc:oracle:thin:@10.220.140.48:1521:test1
Найден элемент: user, его атрибуты:
Name атрибута: value, его meaning: secretOracleUsername
Найден элемент: password, его атрибуты:
Name атрибута: value, его meaning: 111
Найден элемент: mysql, его атрибуты:
Найден элемент: connection, его атрибуты:
Name атрибута: value, его meaning: jdbc:mysql:thin:@10.220.140.48:1521:test1
Найден элемент: user, его атрибуты:
Name атрибута: value, его meaning: secretMySQLUsername
Найден элемент: password, его атрибуты:
Name атрибута: value, его meaning: 222
Ang problema ay matagumpay na nalutas! Gawain Blg. 3 – mula sa sumusunod na XML file, kung saan naka-save ang impormasyon tungkol sa mga mag-aaral, propesor at empleyado, kailangan mong basahin ang impormasyon at i-output ito sa console:
<?xml version="1.0" encoding="UTF-8"?>
<database>
    <students>
        <student name="Maksim" course="3" specialization="CE" />
        <student name="Stephan" course="1" specialization="CS" />
        <student name="Irvin" course="2" specialization="CE" />
    </students>

    <professors>
        <professor name="Herald" experience="7 years in University" discipline="Math" />
        <professor name="Adam" experience="4 years in University" discipline="Programming" />
        <professor name="Anton" experience="6 years in University" discipline="English" />
    </professors>

    <service>
        <member name="John" position="janitor" />
        <member name="Jordan" position="janitor" />
        <member name="Mike" position="janitor" />
    </service>
</database>
Ang gawain ay medyo simple, ngunit kawili-wili. Una, kailangan nating lumikha ng 4 na klase: empleyado, propesor at mag-aaral, pati na rin ang isang karaniwang abstract na klase ng Tao upang dalhin ang variable ng pangalan mula sa bawat klase sa ilalim ng isang karaniwang denominator: Abstract parent class
public abstract class Human {
    private String name;

    public Human(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
Mag-aaral
public class Student extends Human {
    private String course, specialization;

    public Student(String name, String course, String specialization) {
        super(name);
        this.course = course;
        this.specialization = specialization;
    }

    public String getCourse() {
        return course;
    }

    public String getSpecialization() {
        return specialization;
    }

    public String toString() {
        return "Голодный студент " + getName() + " " + course + "-го курса, обучающийся по специальности " + specialization;
    }
}
Propesor
public class Professor extends Human {
    private String experience, discipline;

    public Professor(String name, String experience, String discipline) {
        super(name);
        this.experience = experience;
        this.discipline = discipline;
    }

    public String getExperience() {
        return experience;
    }

    public String getDiscipline() {
        return discipline;
    }

    public String toString() {
        return "Профессор " + getName() + ", обладающий опытом: \"" + experience + "\", выкладает дисциплину " + discipline;
    }
}
Empleado
public class Member extends Human {
    private String position;

    public Member(String name, String position) {
        super(name);
        this.position = position;
    }

    public String getPosition() {
        return position;
    }

    public String toString() {
        return "Сотрудник обслуживающего персонала " + getName() + ", должность: " + position;
    }
}
Ngayong handa na ang aming mga klase, kailangan lang naming magsulat ng code para makuha ang lahat ng elementong mag-aaral, propesor at miyembro, at pagkatapos ay makuha ang kanilang mga katangian. Para sa imbakan, gagamit kami ng isang koleksyon na mag-iimbak ng mga bagay ng parent class na karaniwan sa lahat - Tao. At kaya, ang solusyon sa problemang ito:
public class DOMExample {
    // Коллекция для хранения всех людей
    private static ArrayList<Human> humans = new ArrayList<>();

    // Константы для элементов
    private static final String PROFESSOR = "professor";
    private static final String MEMBER = "member";
    private static final String STUDENT = "student";

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        // Получение фабрики, чтобы после получить билдер documentов.
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        // Получor из фабрики билдер, который парсит XML, создает структуру Document в виде иерархического дерева.
        DocumentBuilder builder = factory.newDocumentBuilder();

        // Запарсor XML, создав структуру Document. Теперь у нас есть доступ ко всем elementм, Howим нам нужно.
        Document document = builder.parse(new File("resource/xml_file3.xml"));

        // Получение информации про каждый элемент отдельно
        collectInformation(document, PROFESSOR);
        collectInformation(document, MEMBER);
        collectInformation(document, STUDENT);

        // Вывод информации
        humans.forEach(System.out::println);
    }

    /**
     * Метод ищет информацию про теги по имени element и вносит всю информацию в коллекцию humans.
     * @param document Документ, в котором будем искать элементы.
     * @param element Name element, теги которого нужно найти. Должна быть одна из констант, которые определяются выше.
     */
    private static void collectInformation(Document document, final String element) {
        // Получение всех элементов по имени тега.
        NodeList elements = document.getElementsByTagName(element);

        // Перебор всех найденных элементов
        for (int i = 0; i < elements.getLength(); i++) {
            // Получение всех атрибутов element
            NamedNodeMap attributes = elements.item(i).getAttributes();
            String name = attributes.getNamedItem("name").getNodeValue();

            // В зависимости от типа element, нам нужно собрать свою дополнительну информацию про каждый подкласс, а после добавить нужные образцы в коллекцию.
            switch (element) {
                case PROFESSOR: {
                    String experience = attributes.getNamedItem("experience").getNodeValue();
                    String discipline = attributes.getNamedItem("discipline").getNodeValue();

                    humans.add(new Professor(name, experience, discipline));
                } break;
                case STUDENT: {
                    String course = attributes.getNamedItem("course").getNodeValue();
                    String specialization = attributes.getNamedItem("specialization").getNodeValue();

                    humans.add(new Student(name, course, specialization));
                } break;
                case MEMBER: {
                    String position = attributes.getNamedItem("position").getNodeValue();

                    humans.add(new Member(name, position));
                } break;
            }
        }
    }
}
Tandaan na kailangan lang namin ang pangalan ng elemento para makuha ang lahat ng elementong ito mula sa dokumento. Lubos nitong pinapasimple ang proseso ng paghahanap ng impormasyong kailangan mo. Ang lahat ng impormasyon tungkol sa code ay kasama sa mga komento. Walang bagong ginamit na wala sa mga nakaraang gawain. Output ng code:
Профессор Herald, обладающий опытом: "7 years in University", выкладает дисциплину Math
Профессор Adam, обладающий опытом: "4 years in University", выкладает дисциплину Programming
Профессор Anton, обладающий опытом: "6 years in University", выкладает дисциплину English
Сотрудник обслуживающего персонала John, должность: janitor
Сотрудник обслуживающего персонала Jordan, должность: janitor
Сотрудник обслуживающего персонала Mike, должность: janitor
Голодный студент Maksim 3-го курса, обучающийся по специальности CE
Голодный студент Stephan 1-го курса, обучающийся по специальности CS
Голодный студент Irvin 2-го курса, обучающийся по специальности CE
Nalutas ang problema! Mga rekomendasyon kung kailan gagamitin ang DOM at kung kailan gagamitin ang SAX Ang pagkakaiba sa pagitan ng mga tool na ito ay nasa functionality at bilis. Kung kailangan mo ng higit na kakayahang umangkop na pag-andar at kayang sayangin ang pagganap ng programa, kung gayon ang iyong pipiliin ay DOM, ngunit kung ang iyong pangunahing layunin ay bawasan ang mga gastos sa memorya, kung gayon ang DOM ay hindi ang pinakamahusay na pagpipilian, dahil binabasa nito ang lahat ng impormasyon mula sa XML file at iniimbak ito. Samakatuwid, ang SAX sequential reading method ay mas mura. Sa madaling sabi: kung kailangan mo ng performance - SAX, functionality - DOM. <h2>Konklusyon</h2>Ang bawat programmer ay may sariling mga tool, at, depende sa gawain, kailangan mong gumamit ng ilang partikular na tool. Sa mga artikulo tungkol sa SAX at DOM, ang layunin ko ay turuan ka kung paano kunin ang impormasyon mula sa mga XML file at iproseso ang mga ito sa paraang kailangan mo ito. Gayunpaman, kahit na nabasa mo na ang mga artikulong ito, hindi mo masasabing natutunan mo kung paano gamitin ang mga tool na ito. Dapat kang magsanay, subukan ang code mula sa mga artikulo, maunawaan kung paano ito gumagana, at subukang magsulat ng isang bagay sa iyong sarili. Pagkatapos ng lahat, ang pinakamahalagang bagay ay pagsasanay. Ang huling artikulo ay mai-publish sa mga darating na araw at, tila, pagkatapos ng pagtatapos ng kumpetisyon, at ilalaan sa JAXB. Ang JAXB ay isang tool para sa pag-save ng mga bagay sa iyong programa sa XML na format. Iyon lang, umaasa ako na ang artikulong ito ay kapaki-pakinabang, at good luck sa iyong programming :) Nakaraang artikulo: [Kumpetisyon] Mga Pangunahing Kaalaman sa XML para sa isang Java Programmer - Bahagi 3.1 ng 3 - SAX
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION