Сохраняет ли SAX Parser все данные в памяти? - PullRequest
0 голосов
/ 12 марта 2019

Я работаю над одним требованием, где мне нужно разбить большой XML и обрабатывать дальше.

Вот пример XML, он может прийти в одну строку.

<?xml version="1.0"?><company><staff><firstname>yong</firstname><firstname>jin</firstname></staff></company>

ИВот мой код:

import java.util.Arrays;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXML {

   public static void main(String argv[]) {

    try {

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean bfname = false;
    boolean blname = false;
    boolean bnname = false;
    boolean bsalary = false;

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {

        System.out.println("Parameters :" + uri +":"+ localName +":"+ qName +":"+ attributes);
        System.out.println("Start Element :" + qName);

        if (qName.equalsIgnoreCase("FIRSTNAME")) {
            bfname = true;
        }

        if (qName.equalsIgnoreCase("LASTNAME")) {
            blname = true;
        }

        if (qName.equalsIgnoreCase("NICKNAME")) {
            bnname = true;
        }

        if (qName.equalsIgnoreCase("SALARY")) {
            bsalary = true;
        }

    }

    public void endElement(String uri, String localName,
        String qName) throws SAXException {

        System.out.println("End Element :" + qName);

    }

    public void characters(char[] ch, int start, int length) throws SAXException {

        System.out.println("Im here:"+Arrays.toString(ch));----Line 1
        if (bfname) {
            System.out.println("First Name : " + new String(ch, start, length));
            bfname = false;
        }

        if (blname) {
            System.out.println("Last Name : " + new String(ch, start, length));
            blname = false;
        }

        if (bnname) {
            System.out.println("Nick Name : " + new String(ch, start, length));
            bnname = false;
        }

        if (bsalary) {
            System.out.println("Salary : " + new String(ch, start, length));
            bsalary = false;
        }

    }

     };

       saxParser.parse("C:\\Lenny\\Work\\XML\\SaxParsing_01.xml", handler);



        /*InputSource input = new InputSource("C:\\Lenny\\Work\\XML\\SaxParsing_01.xml");
        System.out.println(input);
        XMLReader reader = saxParser.getXMLReader();
        reader.parse(input);*/


     } catch (Exception e) {
       e.printStackTrace();
     }

   }

}

Мое первое сомнение: читает ли SAXParser байты разумно?

Во-вторых, я хочу, чтобы мой вывод был таким.

<firstname>yong</firstname>
<firstname>jin</firstname>

Thisэтим я могу управлять, но хочу знать ... как только я получу тег <firstname> и перейду к методу characters, зачем печатать весь XML?Разве он не должен печатать yong только на Line 1, а не печатать весь XML?Это все для печати, так вот почему я думаю, SAXParser сохраняет ли целые данные в памяти или нет?

Любые предложения, пожалуйста ..!

Спасибо

1 Ответ

2 голосов
/ 12 марта 2019

Сохраняет ли SAX Parser все данные в памяти?

Нет, в этом все дело. Гораздо проще загрузить весь документ DOM XML-документа в память, а затем извлечь из него то, что вы хотите, чем использовать громоздкую модель SAX.

Но SAX обладает преимуществами чтения документа на лету, без полной загрузки его в память.

Мое первое сомнение: читает ли SAXParser байты с умом?

Не байт, нет. Это было бы крайне неэффективно, особенно если учесть, что сама задача SAX - работать с огромными документами. Это буферизованное чтение. Не то чтобы это занимало много памяти.

Зачем печатать весь XML? Разве это не должно печатать Ён только на линии 1, а не печатать весь XML? Его печать все, так вот почему я думая, SAXParser хранит целые данные в памяти или нет?

См. Выше, по причинам нормального исполнения, SAX использует буфер для чтения. Символ char [], указанный в качестве параметра для метода characters (), является примерно вышеупомянутым буфером.

В вашем примере ваш документ крошечный, и, конечно, он будет полностью помещаться в реальный буфер, предназначенный для чтения документа. Если вы будете работать с большими документами, вы заметите, что буфер содержит тысячи символов, но далеко не весь документ.

...