JavaRush /جاوا بلاگ /Random-SD /جاوا پروگرامر لاءِ XML بنياديات. حصو 3.2 جو 3 - DOM
Ярослав
سطح
Днепр

جاوا پروگرامر لاءِ XML بنياديات. حصو 3.2 جو 3 - DOM

گروپ ۾ شايع ٿيل
<h2>تعارف</h2>هيلو مضمون جي سڀني پڙهندڙن کي، هي حصو DOM لاءِ وقف آهي. ايندڙ هڪ JAXB لاءِ وقف ڪيو ويندو ۽، ان سان گڏ، XML بنياديات جو چڪر مڪمل ڪيو ويندو. پهرين اتي ٿورو نظريو ٿيندو، ۽ پوء صرف مشق. اچو ته شروع ڪريون. <h2>DOM (Document Object Model) - THEORY</h2>DOM هينڊلر کي اهڙي طرح ٺاهيو ويو آهي ته اهو سڀ XML هڪ ئي وقت پڙهي ٿو ۽ ان کي محفوظ ڪري ٿو، هڪ وڻ جي شڪل ۾ هڪ ترتيب وار ترتيب ڏئي ٿو جنهن ذريعي اسان آساني سان منتقل ڪري سگهون ٿا. ۽ اسان کي گهربل عناصر تائين رسائي حاصل ڪريو. اهڙيء طرح، اسان ڪري سگهون ٿا، مٿين عنصر کي هڪ لنڪ ڏنو وڃي، ان جي اندروني عناصر لاء سڀئي لنڪ حاصل ڪري سگهون ٿا. ان کان علاوه، جيڪي عنصر اندر آهن اهي عنصر هن عنصر جا ٻار آهن، ۽ اهو انهن جي والدين آهي. هڪ دفعو اسان سڀني XML کي ميموري ۾ پڙهي سگهون ٿا، اسان صرف ان جي جوڙجڪ ذريعي سفر ڪنداسين ۽ عمل ڪنداسين جيڪي اسان کي گهربل آهن. جاوا ۾ DOM جي پروگرامنگ حصي بابت ٿورڙو: DOM وٽ ڪيترائي انٽرفيس آھن جيڪي مختلف ڊيٽا کي بيان ڪرڻ لاءِ ٺاھيا ويا آھن. اهي سڀئي انٽرفيس هڪ عام انٽرفيس جي وارث آهن - نوڊ. ڇو ته، حقيقت ۾، DOM ۾ سڀ کان وڌيڪ عام ڊيٽا جو قسم نوڊ آهي، جيڪو ڪجھ به ٿي سگهي ٿو. هر نوڊ وٽ معلومات حاصل ڪرڻ لاءِ هيٺيان مفيد طريقا آهن:
  1. getNodeName- ميزبان جو نالو حاصل ڪريو.
  2. getNodeValue- حاصل ڪريو نوڊ قدر.
  3. getNodeType- نوڊ جو قسم حاصل ڪريو.
  4. getParentNode- حاصل ڪريو نوڊ جنهن جي اندر ڏنل نوڊ واقع آهي.
  5. getChildNodes- سڀ نڪتل نوڊس حاصل ڪريو (نوڊس جيڪي ڏنل نوڊ اندر آھن).
  6. getAttributes- حاصل ڪريو سڀ نوڊ خاصيتون.
  7. getOwnerDocument- هن نوڊ جي سند حاصل ڪريو.
  8. getFirstChild/getLastChild- پهريون/آخري نڪتل نوڊ حاصل ڪريو.
  9. getLocalName- ڪارائتو جڏهن پروسيسنگ نالن جي جڳهن کي بغير ڪنهن پريفڪس جي نالي حاصل ڪرڻ لاءِ.
  10. getTextContent- سڀني متن کي هڪ عنصر جي اندر ۽ سڀني عناصر کي ڏنل عنصر جي اندر، جنهن ۾ لائين برڪ ۽ اسپيس شامل آهن.
طريقو 9 تي نوٽ ڪريو: اھو ھميشه ناڪاري موٽندو جيستائين توھان DocumentFactory ۾ setNamespaceAware(true) طريقو استعمال نه ڪيو آھي نالو اسپيس پروسيسنگ کي شروع ڪرڻ لاءِ. هاڻي، هڪ اهم تفصيل: طريقا سڀني نوڊس لاءِ عام آهن، پر نوڊ ۾ اسان وٽ هڪ عنصر ۽ هڪ صفت ٻئي ٿي سگهن ٿا. ۽ هتي سوال آهن: هڪ عنصر ڪهڙي قدر ڪري سگهي ٿو؟ ڪھڙا نڪتل نوڊس ھڪڙي خاصيت حاصل ڪري سگھن ٿا؟ ۽ ٻيا برابر نه آهن. ۽ هر شيء بلڪل سادو آهي: هر طريقو ڪم ڪندو نوڊ جي قسم تي منحصر ڪري ٿو . اهو منطق استعمال ڪرڻ لاء ڪافي آهي، يقينا، جيئن ته پريشان ٿيڻ نه. مثال طور: ڪھڙين صفتن جي صلاحيت رکي ٿي؟ ان عنصر جو ٻيو ڪهڙو مطلب آهي؟ بهرحال، هر شي پاڻ کي ڪوشش نه ڪرڻ لاء، سرڪاري دستاويزن ۾ هڪ تمام مفيد جدول آهي ته هر طريقو ڪيئن ڪم ڪري ٿو نوڊ جي قسم تي منحصر آهي: معيار خراب ٿي وئي، تنهنڪري هتي دستاويز جي لنڪ آهي (ٽيبل تي. صفحي جي مٿين حصي): نوڊ دستاويزي ياد رکڻ لاءِ سڀ کان اهم شيءِ:
  1. صرف عناصر ۾ خاصيتون آهن.
  2. عناصر جي ڪا به معنيٰ ناهي.
  3. عنصر نوڊ جو نالو ٽيگ جي نالي سان ساڳيو آهي، ۽ خاصيت جي نالي جو نالو ساڳيو آهي.
<h2>DOM (Document Object Model) - PRACTICE</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 طبقن ٺاهڻ جي ضرورت آهي: ملازم، پروفيسر ۽ شاگرد، گڏوگڏ هڪ عام تجريدي طبقو انسان، هر طبقي مان نالو متغير کي هڪ عام فرق هيٺ آڻڻ لاءِ: Abstract والدين ڪلاس.
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 بنياديات جاوا پروگرامر لاءِ - حصو 3.1 جو 3 - SAX
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION