Проблема при чтении из XML файла. Java, Sax parser

151
07 марта 2019, 18:50

У меня есть файл в 17.5 мб, и где-то в середине все ломается ( то есть до этого понятное дело нормально проходит). В общем. main:

package main.java.SimanticAnalysis;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class SimanticAnalysisApplication {
    private static ArrayList<Comment> comments = new ArrayList<>();
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        XMLHandler handler = new XMLHandler();
        parser.parse(new File(
                "/Users/Yaroslav/Desktop/SimaticAnalysis/src/main/resource/MyComments3.xml"), handler);
        int size = 0;
        for (Comment comment: comments){
            size++;
        }
        System.out.print(size);
    }
    private static class XMLHandler extends DefaultHandler {
        private Integer score, content_id, element_id, user_id;
        private String text = "", lastElementName;
        private Attributes attributesForCharacters;
        @Override
        public void startDocument() throws SAXException {
            // Тут будет логика реакции на начало документа
        }
        @Override
        public void endDocument() throws SAXException {
            // Тут будет логика реакции на конец документа
        }
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes)
                throws SAXException {
            // Тут будет логика реакции на начало элемента
            lastElementName = qName;
            attributesForCharacters = attributes;
        }
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // Тут будет логика реакции на конец элемента
            if( score != null && content_id != null && element_id != null && user_id != null &&
                    !text.equals("") ){
                System.out.print("add Comment!");
                comments.add(new Comment(score, content_id, element_id, user_id, text));
                score = null;
                content_id = null;
                element_id = null;
                user_id = null;
                text = "";
            }
        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            String information = new String(ch, start, length);
            System.out.print(lastElementName+" ");
            System.out.print(attributesForCharacters.getValue("columnNumber")+" ");
            System.out.print(information + "\n");
            information = information.replace("\n", "").trim();
            if (!information.isEmpty()) {
                if (lastElementName.equals("value")
                        && attributesForCharacters.getValue("columnNumber").equals("0"))
                    score = Integer.parseInt(information);
                if (lastElementName.equals("value")
                        && attributesForCharacters.getValue("columnNumber").equals("1"))
                    content_id = Integer.parseInt(information);
                if (lastElementName.equals("value")
                        && attributesForCharacters.getValue("columnNumber").equals("2"))
                    element_id = Integer.parseInt(information);
                if (lastElementName.equals("value")
                        && attributesForCharacters.getValue("columnNumber").equals("3"))
                    user_id = Integer.parseInt(information);
                if (lastElementName.equals("value")
                        && attributesForCharacters.getValue("columnNumber").equals("4"))
                    text = text + information;
            }
        }
        @Override
        public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
            // Тут будет логика реакции на пустое пространство внутри элементов (пробелы, переносы строчек и так далее).
        }
    }
}

Класс Comment:

package main.java.SimanticAnalysis;
public class Comment {
    private Integer score, content_id, element_id, user_id;
    private String text;
    public Comment(int score, int content_id, int element_id, int user_id, String text){
        this.score = score;
        this.content_id = content_id;
        this.element_id = element_id;
        this.user_id = user_id;
        this.text = text;
    }
    public Integer getScore(){ return  score; }
    public Integer getContent_id(){ return content_id; }
    public Integer getElement_id(){ return element_id; }
    public Integer getUser_id(){ return user_id; }
    public String getText(){ return text; }
}

Ошибка в

Что выдает java

то-есть он считывает columnNumber и получает 1, а должен 4... В чем может быть проблема?

Ps. Если из кода удалить элементы content_id, element_id и user_id, то он уйдет дальше до 50тыс строчки, но все равно заглохнет.

READ ALSO
Получение всех похожих view. Android

Получение всех похожих view. Android

Дано приложение где есть много одинаковых view и button,

157
Как разбить число на части?

Как разбить число на части?

Есть число формата DDDDDRRRPCНужно отделить C, P, RRR, DDDDDD

174
Конвертация java в Kotlin

Конвертация java в Kotlin

Пишу приложение по статье, но только на Kotline

144