JavaRush /จาวาบล็อก /Random-TH /พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java ส่วนที่ 3.2 จาก 3 - D...
Ярослав
ระดับ
Днепр

พื้นฐาน XML สำหรับโปรแกรมเมอร์ Java ส่วนที่ 3.2 จาก 3 - DOM

เผยแพร่ในกลุ่ม
<h2>บทนำ</h2>สวัสดีผู้อ่านบทความทุกคน ส่วนนี้จัดทำขึ้นเพื่อ DOM โดยเฉพาะ หัวข้อถัดไปจะกล่าวถึง JAXB และด้วยเหตุนี้ วงจรพื้นฐานของ XML จึงจะเสร็จสมบูรณ์ ขั้นแรกจะมีทฤษฎีเล็กๆ น้อยๆ จากนั้นจึงฝึกฝนเท่านั้น มาเริ่มกันเลย. <h2>DOM (Document Object Model) - ทฤษฎี</h2>ตัวจัดการ DOM ได้รับการออกแบบในลักษณะที่จะอ่าน XML ทั้งหมดในครั้งเดียวและบันทึกมัน สร้างลำดับชั้นในรูปแบบของต้นไม้ซึ่งเราสามารถย้ายได้อย่างง่ายดาย และเข้าถึงองค์ประกอบที่เราต้องการ ดังนั้นเราจึงสามารถรับลิงก์ทั้งหมดไปยังองค์ประกอบภายในของมันได้ ยิ่งไปกว่านั้น องค์ประกอบที่อยู่ภายในองค์ประกอบนั้นเป็นลูกขององค์ประกอบนี้ และเป็นองค์ประกอบหลัก เมื่อเราอ่าน XML ทั้งหมดลงในหน่วยความจำแล้ว เราก็จะเดินทางผ่านโครงสร้างของมันและดำเนินการตามที่เราต้องการ เล็กน้อยเกี่ยวกับส่วนการเขียนโปรแกรมของ DOM ใน Java: DOM มีอินเทอร์เฟซมากมายที่สร้างขึ้นเพื่ออธิบายข้อมูลที่แตกต่างกัน อินเทอร์เฟซทั้งหมดเหล่านี้สืบทอดอินเทอร์เฟซทั่วไปหนึ่งอินเทอร์เฟซ - โหนด เพราะในความเป็นจริงแล้ว ประเภทข้อมูลที่พบบ่อยที่สุดใน DOM คือ Node ซึ่งสามารถเป็นอะไรก็ได้ แต่ละโหนดมีวิธีการที่เป็นประโยชน์ดังต่อไปนี้ในการดึงข้อมูล:
  1. getNodeName– รับชื่อโฮสต์
  2. getNodeValue– รับค่าโหนด
  3. getNodeType– รับประเภทโหนด
  4. getParentNode– รับโหนดที่โหนดที่กำหนดตั้งอยู่
  5. getChildNodes– รับโหนดที่ได้รับทั้งหมด (โหนดที่อยู่ภายในโหนดที่กำหนด)
  6. getAttributes– รับแอตทริบิวต์โหนดทั้งหมด
  7. getOwnerDocument– รับเอกสารของโหนดนี้
  8. getFirstChild/getLastChild– รับโหนดที่ได้รับครั้งแรก/สุดท้าย
  9. getLocalName– มีประโยชน์เมื่อประมวลผลเนมสเปซเพื่อให้ได้ชื่อที่ไม่มีคำนำหน้า
  10. getTextContent– ส่งคืนข้อความทั้งหมดภายในองค์ประกอบและองค์ประกอบทั้งหมดภายในองค์ประกอบที่กำหนด รวมถึงตัวแบ่งบรรทัดและช่องว่าง
หมายเหตุเกี่ยวกับวิธีที่ 9: มันจะคืนค่า null เสมอ เว้นแต่ว่าคุณได้ใช้เมธอด setNamespaceAware(true) ใน DocumentFactory เพื่อทริกเกอร์การประมวลผลเนมสเปซ มาถึงรายละเอียดที่สำคัญ: วิธีการต่างๆ นั้นเหมือนกันกับทุก Node แต่ใน Node เราสามารถมีทั้งองค์ประกอบและแอตทริบิวต์ได้ และนี่คือคำถาม: องค์ประกอบสามารถมีค่าได้เท่าใด โหนดที่ได้รับมาแบบใดที่แอตทริบิวต์สามารถมีได้ และอื่นๆไม่สอดคล้องกัน และทุกอย่างค่อนข้างง่าย: แต่ละ วิธีจะทำงานขึ้นอยู่กับประเภทของโหนด แน่นอนว่าการใช้ตรรกะก็เพียงพอแล้วเพื่อไม่ให้สับสน ตัวอย่างเช่น: คุณลักษณะใดบ้างที่สามารถมีได้? องค์ประกอบมีความหมายอื่นใดอีก? อย่างไรก็ตาม เพื่อไม่ให้ลองทุกอย่างด้วยตัวเอง ในเอกสารอย่างเป็นทางการจึงมีตารางที่มีประโยชน์มากเกี่ยวกับวิธีการทำงานแต่ละวิธีขึ้นอยู่กับประเภทของโหนด: คุณภาพกลายเป็นไม่ดี ดังนั้นนี่คือลิงค์ไปยังเอกสารประกอบ (ตารางที่ ด้านบนของหน้า): Node Documentation สิ่งที่สำคัญที่สุดที่ต้องจำ:
  1. องค์ประกอบเท่านั้นที่มีคุณสมบัติ
  2. องค์ประกอบไม่มีความหมาย
  3. ชื่อของโหนดองค์ประกอบจะเหมือนกับชื่อของแท็ก และชื่อของโหนดแอตทริบิวต์จะเหมือนกับชื่อของแอตทริบิวต์
<h2>DOM (Document Object Model) - การปฏิบัติ</h2>ในภาคปฏิบัติ เราจะวิเคราะห์งานประเภทต่างๆ ในการค้นหาข้อมูลในรูปแบบ XML นอกจากนี้เรายังเอาสองงานจากบทความที่แล้วเพื่อเปรียบเทียบความสะดวกสบาย มาเริ่มกันเลย และเป็นการดีที่จะเริ่มต้นด้วยการนำเข้า:
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;
ฉันจัดให้มีการนำเข้าเพื่อไม่ให้คลาสสับสน :) ภารกิจที่ 1 - เราจำเป็นต้องได้รับข้อมูลเกี่ยวกับพนักงานทั้งหมดและส่งออกไปยังคอนโซลจากไฟล์ XML ต่อไปนี้:
<?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>
ดังที่เราเห็น เรามีข้อมูลทั้งหมดที่จัดเก็บไว้ในองค์ประกอบของพนักงาน เพื่อที่จะเก็บไว้ที่ไหนสักแห่งในโปรแกรมของเรา เรามาสร้างคลาสกัน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;
    }
}
ตอนนี้เรามีคำอธิบายโครงสร้างการจัดเก็บข้อมูลแล้ว เราต้องการคอลเลกชันที่จะจัดเก็บพนักงาน เราจะสร้างมันขึ้นมาในโค้ดนั้นเอง เรายังจำเป็นต้องสร้างเอกสารตาม 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"));
    }
}
เมื่อเราได้รับเอกสาร เราจะมีอำนาจไม่จำกัดเหนือโครงสร้างทั้งหมดของไฟล์ XML เราสามารถดึงองค์ประกอบใดๆ ได้ตลอดเวลา กลับไปตรวจสอบข้อมูลใดๆ และโดยทั่วไปแล้ว แนวทางที่ยืดหยุ่นกว่าที่เรามีใน SAX ในบริบทของงานนี้ เราเพียงแค่ต้องแยกองค์ประกอบพนักงานทั้งหมด จากนั้นจึงดึงข้อมูลทั้งหมดเกี่ยวกับองค์ประกอบเหล่านั้น มันค่อนข้างง่าย:
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()));
    }
}
คำอธิบายของโซลูชันนี้ถูกต้องในโซลูชัน ขอแนะนำให้ย้อนกลับไปที่ทฤษฎีแล้วอ่านอีกครั้งหลังจากดูโค้ดแล้ว ในความเป็นจริงทุกอย่างชัดเจนโดยสัญชาตญาณ อ่านความคิดเห็นอย่างละเอียดและไม่ควรมีคำถามใดๆ และหากมี คุณสามารถเขียนในความคิดเห็น ฉันจะตอบ หรือในลิงก์ หรือเพียงเรียกใช้ IDEA ของคุณแล้วลองเล่นกับโค้ดด้วยตัวเองหาก คุณยังไม่ได้ทำ หลังจากรันโค้ดแล้ว เราก็ได้ผลลัพธ์ดังนี้:
Информации о сотруднике: 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.
อย่างที่คุณเห็น งานนี้สำเร็จลุล่วงไปด้วยดี! เราไปยังงานต่อไปกันดีกว่า :) ภารกิจที่ 2 - ชื่อขององค์ประกอบถูกป้อนจากคอนโซลซึ่งคุณต้องแสดงข้อมูลเกี่ยวกับองค์ประกอบทั้งหมดที่อยู่ภายในและคุณลักษณะขององค์ประกอบจากไฟล์ XML ต่อไปนี้:
<?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>
ทุกอย่างค่อนข้างง่าย: เราต้องได้รับองค์ประกอบตามชื่อที่เรานับ จากนั้นจึงผ่านโหนดย่อยทั้งหมด ในการดำเนินการนี้ คุณจะต้องวนซ้ำโหนดย่อยทั้งหมดของโหนดย่อยทั้งหมดที่เป็นองค์ประกอบ วิธีแก้ไขปัญหานี้:
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());
        }
    }
}
คำอธิบายทั้งหมดของวิธีแก้ปัญหาอยู่ในความคิดเห็น แต่ฉันอยากจะอธิบายแนวทางที่เราใช้ในรูปแบบกราฟิกเล็กน้อย โดยใช้ตัวอย่างจากรูปภาพจากทฤษฎี เราจะถือว่าเราจำเป็นต้องแสดงข้อมูลเกี่ยวกับแท็ก html อย่างที่คุณเห็น เราต้องเริ่มจากโคนต้นไม้จากบนลงล่าง เส้นทั้งหมดเป็นโหนด ในการแก้ปัญหา เราจะไปจากจุดเริ่มต้นขององค์ประกอบที่ต้องการผ่านโหนดทั้งหมดแบบวนซ้ำ และหากโหนดใดโหนดหนึ่งเป็นองค์ประกอบ เราก็จะวนซ้ำโหนดทั้งหมดขององค์ประกอบนี้ด้วย หลังจากรันโค้ดแล้ว เราได้ผลลัพธ์ต่อไปนี้สำหรับองค์ประกอบรูท:
Элемент был найден!
Найден элемент: 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
ปัญหาได้รับการแก้ไขเรียบร้อยแล้ว! ภารกิจที่ 3 – จากไฟล์ XML ต่อไปนี้ ซึ่งมีการบันทึกข้อมูลเกี่ยวกับนักเรียน อาจารย์ และพนักงาน คุณต้องอ่านข้อมูลและส่งออกไปยังคอนโซล:
<?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>
งานค่อนข้างง่าย แต่น่าสนใจ ขั้นแรก เราต้องสร้างคลาส 4 คลาส: พนักงาน ศาสตราจารย์ และนักเรียน รวมถึงคลาสนามธรรมทั่วไป Human เพื่อนำตัวแปรชื่อจากแต่ละคลาสมาเป็นตัวส่วนร่วม: คลาสผู้ปกครองที่เป็นนามธรรม
public abstract class Human {
    private String name;

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

    public String getName() {
        return name;
    }
}
นักเรียน
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;
    }
}
ศาสตราจารย์
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;
    }
}
พนักงาน
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;
    }
}
ตอนนี้ชั้นเรียนของเราพร้อมแล้ว เราเพียงแค่ต้องเขียนโค้ดเพื่อรับองค์ประกอบทั้งหมด นักเรียน อาจารย์ และสมาชิก จากนั้นรับคุณลักษณะของพวกเขา สำหรับการจัดเก็บ เราจะใช้คอลเลกชันที่จะจัดเก็บวัตถุของคลาสหลักที่ทุกคนใช้ร่วมกัน - มนุษย์ ดังนั้นวิธีแก้ปัญหานี้:
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;
            }
        }
    }
}
โปรดทราบว่าเราต้องการเพียงชื่อองค์ประกอบเพื่อรับองค์ประกอบทั้งหมดเหล่านี้จากเอกสาร สิ่งนี้ทำให้กระบวนการค้นหาข้อมูลที่คุณต้องการง่ายขึ้นอย่างมาก ข้อมูลทั้งหมดเกี่ยวกับรหัสรวมอยู่ในความคิดเห็น ไม่มีการใช้สิ่งใหม่ที่ไม่มีอยู่ในงานก่อนหน้านี้ รหัสเอาท์พุท:
Профессор 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
แก้ไขปัญหา! คำแนะนำเมื่อใดควรใช้ DOM และเมื่อใดควรใช้ SAX ความแตกต่างระหว่างเครื่องมือเหล่านี้อยู่ที่ฟังก์ชันการทำงานและความเร็ว หากคุณต้องการฟังก์ชันการทำงานที่ยืดหยุ่นมากขึ้นและสามารถสิ้นเปลืองประสิทธิภาพของโปรแกรมได้ ตัวเลือกของคุณคือ DOM แต่หากเป้าหมายหลักของคุณคือการลดต้นทุนหน่วยความจำ DOM ก็ไม่ใช่ตัวเลือกที่ดีที่สุด เนื่องจากจะอ่านข้อมูลทั้งหมดจากไฟล์ XML และ เก็บไว้ ดังนั้นวิธีการอ่านตามลำดับ SAX จึงมีราคาถูกกว่า โดยย่อ: หากคุณต้องการประสิทธิภาพ - SAX ฟังก์ชันการทำงาน - DOM <h2>บทสรุป</h2>โปรแกรมเมอร์แต่ละคนมีเครื่องมือของตัวเอง และคุณต้องใช้เครื่องมือบางอย่างขึ้นอยู่กับงาน ในบทความเกี่ยวกับ SAX และ DOM เป้าหมายของฉันคือการสอนวิธีดึงข้อมูลจากไฟล์ XML และประมวลผลตามที่คุณต้องการ อย่างไรก็ตาม แม้ว่าคุณจะได้อ่านบทความเหล่านี้แล้ว คุณก็ไม่สามารถอ้างว่าได้เรียนรู้วิธีใช้เครื่องมือเหล่านี้แล้ว คุณควรฝึกฝน ทดสอบโค้ดจากบทความ ทำความเข้าใจวิธีการทำงาน และลองเขียนบางอย่างด้วยตัวเอง ท้ายที่สุดสิ่งที่สำคัญที่สุดคือการฝึกฝน บทความสุดท้ายจะได้รับการเผยแพร่ในอีกไม่กี่วันข้างหน้า และหลังจากสิ้นสุดการแข่งขัน และจะอุทิศให้กับ JAXB JAXB เป็นเครื่องมือสำหรับบันทึกวัตถุในโปรแกรมของคุณในรูปแบบ XML ฉันหวังว่าบทความนี้จะมีประโยชน์ และขอให้โชคดีในการเขียนโปรแกรมของคุณ :) บทความก่อนหน้า: [การแข่งขัน] ข้อมูลพื้นฐานเกี่ยวกับ XML สำหรับโปรแกรมเมอร์ Java - ตอนที่ 3.1 จาก 3 - SAX
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION