Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг + вывод в файл 
V
    Опции темы
ioManip
Дата 20.9.2014, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Привет! Есть xml файл такого содержания: 
Код

<?xml version = "1.0"?>
<note>
<to> Вася </to>
<from> Петя </from>
<head> Напоминание </head>
<body> Когда в конце концов? </body>
</note>


Мне нужно записать в файл только то, что находится между тегов, делаю это так:

Код

public class ReadXML extends DefaultHandler{  
   
    public void getXml(){ 
        
        try {  
      
         // Получение и настройка парсера SAX
         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();  

         // Получение объекта SAX
         SAXParser saxParser = saxParserFactory.newSAXParser();  
            
         // Обработчик по умолчанию
         DefaultHandler defaultHandler = new DefaultHandler(){  

            String noteTag = "close";  
            String toTag = "close";  
            String fromTag = "close";  
            String headTag = "close";
            String bodyTag = "close";

            // Метод начинате работу, когда встретит '<'  
            @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  

              if (qName.equalsIgnoreCase("note")) {  
                    noteTag = "open";  
              } 
              
              if (qName.equalsIgnoreCase("to")) {  
                    toTag = "open";  
              } 
              
              if (qName.equalsIgnoreCase("from")) {  
                    fromTag = "open";  
              }  
              
              if (qName.equalsIgnoreCase("head")) {  
                    headTag = "open";  
              }  
              
              if (qName.equalsIgnoreCase("body")) {  
                    bodyTag = "open";  
              }  
            }  

            // Метод берет значениея между '<' и '>'  
            @Override
            public void characters(char ch[], int start, int length) throws SAXException {  
                
              File file = new File("out.txt");
              
            try {
                  
                 PrintWriter out = new PrintWriter(file.getAbsoluteFile());

            try {
                if (fromTag.equals("open")) {  
                    out.println("Список отправителей: " + new String(ch, start, length));
                   // System.out.println("Список отправителей: " + new String(ch, start, length));
                } 
                
                if (toTag.equals("open")) {  
                    out.println("Список получателей: " + new String(ch, start, length));
                   // System.out.println("Список получателей: " + new String(ch, start, length));
                }  
                if (headTag.equals("open")) {  
                    out.println("Заголовки: " + new String(ch, start, length));
                   // System.out.println("Заголовки: " + new String(ch, start, length));
                }  
                
                } finally {
                    out.close();
                }  
            } catch(Exception ex) {
                 throw new RuntimeException(ex);
                }  
            }

            // Метод закрывает теги 
            @Override
            public void endElement(String uri, String localName, String qName) throws SAXException {  

              if (qName.equalsIgnoreCase("NOTE")) {  
                    noteTag = "close";  
              } 
              
              if (qName.equalsIgnoreCase("TO")) {  
                    toTag = "close";  
              } 
              
              if (qName.equalsIgnoreCase("FROM")) {  
                    fromTag = "close";  
              }  
              
              if (qName.equalsIgnoreCase("HEAD")) {  
                    headTag = "close";  
              }  
              
              if (qName.equalsIgnoreCase("BODY")) {  
                    bodyTag = "close";  
              }
            }  
         };  

          saxParser.parse("1.xml", defaultHandler);  
        } catch (Exception ex) {  
            ex.printStackTrace();  
       }  
    }  
}


Запись в файл у меня происходит в методе characters, но проблема в том, что  выходной файл пуст! Я может не правильно записываю?
P.S. В консоль выводит все верно.

Это сообщение отредактировал(а) ioManip - 20.9.2014, 09:21
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
math64
Дата 22.9.2014, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Файл нужно открывать один раз в startDocument и закрыть в endDocument. При повторном отрытии все стирается.

Добавлено @ 08:58
PS: xxxTag можно объявить boolean, а строковые константы static final String, чтобы не повторялись (static final String NOTE = "note"), то у тебя в одном месте "note", а в другом "NOTE" - некрасиво.

Это сообщение отредактировал(а) math64 - 22.9.2014, 08:59
PM   Вверх
ioManip
Дата 28.9.2014, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



math64, Спасибо за советы, но сделал немного иначе: 

Код

public class ReadXML {

    public void read() throws Exception {

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

        File folder = new File(".");
        File[] listOfFiles = folder.listFiles();

        for (File file : listOfFiles) {
            if (file.isFile() && file.getName().endsWith(".xml")) {
                Handler handler = new Handler();
                saxParser.parse(file, handler);
                save(handler, "out.txt");
            }
        }
    }

    private void save(Handler handler, String filename) throws IOException {
        
        BufferedWriter out = new BufferedWriter(new FileWriter(filename));
        out.append(handler.getFrom());
        out.newLine();
        out.append(handler.getTo());
        out.newLine();
        out.append(handler.getHead());
        out.newLine();
        out.append(handler.getBody());
        out.newLine();
        out.close();
    }

    private class Handler extends DefaultHandler {

        private StringBuilder content;
        private String to;
        private String from;
        private String body;
        private String head;

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            content = new StringBuilder();
        }

        @Override
        public void characters(char ch[], int start, int length) throws SAXException {
            content.append(ch, start, length);
        }

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

            if ("to".equals(qName)) {
                to = content.toString();
            } else if ("from".equals(qName)) {
                from = content.toString();
            } else if ("body".equals(qName)) {
                body = content.toString();
            } else if ("head".equals(qName)) {
                head = content.toString();
            }
        }

        public String getTo() {
            return to;
        }

        public String getFrom() {
            return from;
        }

        public String getBody() {
            return body;
        }

        public String getHead() {
            return head;
        }
    }
}


Но только теперь файл out.txt такого содержания:
Код

null
null
null
null

Если по отдельности файлы читать то, все в порядке.
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.