С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 9

Парсинг + вывод в файл

21.09.2014, 06:21. Показов 1011. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Есть xml файл такого содержания:
XML
1
2
3
4
5
6
7
<?xml version = "1.0"?>
<note>
<to> Вася </to>
<from> Петя </from>
<head> Напоминание </head>
<body> Когда в конце концов? </body>
</note>
Мне нужно записать в файл только то, что находится между тегов, делаю это так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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 {  
 
            try {
                  
                BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
 
            try {
                if (fromTag.equals("open")) {  
                    out.write("Список отправителей: " + new String(ch, start, length));
                    System.out.println("Список отправителей: " + new String(ch, start, length));
                } 
                
                if (toTag.equals("open")) {  
                    out.write("Список получателей: " + new String(ch, start, length));
                    System.out.println("Список получателей: " + new String(ch, start, length));
                }  
                if (headTag.equals("open")) {  
                    out.write("Заголовки: " + new String(ch, start, length));
                    System.out.println("Заголовки: " + new String(ch, start, length));
                }  
                
                } finally {
                    out.flush();
                    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";  
              }
            }  
         };  
         
         File folder = new File("D:\\Source Code\\NetBeans\\Java\\BGPU\\ParseXMLFile");
         File[] listOfFiles = folder.listFiles();
         
         for (int i = 0; i < listOfFiles.length; i++) {
             File file = listOfFiles[i];
             if (file.isFile() && file.getName().endsWith(".xml")) {
                 saxParser.parse(file, defaultHandler);
                 System.out.println();
             }
         }
         
        } catch (Exception ex) {  
            ex.printStackTrace();  
       }  
    }  
}
Запись в файл у меня происходит в методе characters, но проблема в том, что выходной файл пуст! Я может не правильно записываю?
P.S. В консоль выводит все верно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.09.2014, 06:21
Ответы с готовыми решениями:

Строка: Парсинг арифметического выражения и вывод на экран результата
На входе: строка вида 18 + 5 (сумма или разность целых чисел). На выходе: результат выражения. public class Lab2 { public static...

Filewriter, filereader. вывод рандомных чисел в файл, сортировка их в другой файл
Создать класс, который создает и заполняет файл случайными целыми числами, затем читает файл и выводит его содержимое в другой файл,...

Вывод файла, ввод в файл новых строк и сохранение этого в файл
у меня есть файл, с property и мне в него надо записать новые пары идентификатор = значение я наивно полагал что это будет работать, но...

9
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
21.09.2014, 11:03
Не вникал особо в код т.к он нечитаем. Скорее всего вы каждый раз переписываете файл а не дописываете в конец.
На вашем месте я бы переписал весь парсер примерно следующим образом

note.xml
XML
1
2
3
4
5
6
7
<?xml version = "1.0"?>
<note>
<to> Вася </to>
<from> Петя </from>
<head> Напоминание </head>
<body> Когда в конце концов? </body>
</note>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.File;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
 
public class Solution {
 
 
    public static void main(String[] args) {
        
        try {
            
        JAXBContext jaxbContext = JAXBContext.newInstance(NoteDto.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        NoteDto resultNote = (NoteDto) jaxbUnmarshaller.unmarshal(new File("C:\\dev\\note.xml"));
            
 
        System.out.println(resultNote);
 
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
 
}


NoteDto


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement
public class NoteDto
{
    private String to;
 
    private String body;
 
    private String from;
 
    private String head;
 
    public String getTo ()
    {
        return to;
    }
 
 
 
    @XmlElement
    public void setTo (String to)
    {
        this.to = to;
    }
 
    public String getBody ()
    {
        return body;
    }
 
    @XmlElement
    public void setBody (String body)
    {
        this.body = body;
    }
 
    public String getFrom ()
    {
        return from;
    }
 
    @XmlElement
    public void setFrom (String from)
    {
        this.from = from;
    }
 
    public String getHead ()
    {
        return head;
    }
 
    @XmlElement
    public void setHead (String head)
    {
        this.head = head;
    }
    
    @Override
    public String toString() {
        return "Note [to=" + to + ", body=" + body + ", from=" + from
                + ", head=" + head + "]";
    }
}

Вывод программы для вашего файла:

Bash
1
Note [to= Вася , body= Когда в конце концов? , from= Петя , head= Напоминание ]
Добавлено через 2 минуты
После того как вы получили объект, с ним удобно работать и делать что угодно. Записать в файл, передать по сети и.т.д
1
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 9
21.09.2014, 12:00  [ТС]
KEKCoGEN, Спасибо, за пример, но я вот что думаю, если данные перезаписываются, то все равно какое то значение должно было бы записаться в файл, к примеру последнее. Но файл пуст
0
15 / 15 / 3
Регистрация: 20.05.2014
Сообщений: 157
21.09.2014, 12:07
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
На вашем месте я бы переписал весь парсер примерно следующим образом
note.xml
Код XML
XML
1
2
3
4
5
6
7
<?xml version = "1.0"?>
<note>
<to> Вася </to>
<from> Петя </from>
<head> Напоминание </head>
<body> Когда в конце концов? </body>
</note>
я бы сделал несколько иначе
XML
1
2
3
4
5
6
7
<?xml version = "1.0"?>
<note>
<to>Настя</to>
<from>Петя</from>
<head> Напоминание </head>
<body> Когда в конце концов? </body>
</note>
0
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 9
21.09.2014, 12:12  [ТС]
Andreas, Эмм, вы просто поменяли Имя и убрали пару пробелов, разве это что то меняет? Если это шутка, то я не понял ее
0
15 / 15 / 3
Регистрация: 20.05.2014
Сообщений: 157
21.09.2014, 12:17
Настена12, ничего, подрастешь-поймешь )

время сейчас такое... ник "Настена12", а говорит о себе: "не понял", видно в коде тоже самое - роли перепутаны))
0
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 9
21.09.2014, 12:19  [ТС]
Andreas, Ждал этого, такой ник сделал специально, чтобы отвечали побыстрее, заметил, что девочкам быстрее помогают(на самом деле я парень, конечно)...так что вот так вот, но мы отвлеклись, по моей проблеме есть мысли?
0
15 / 15 / 3
Регистрация: 20.05.2014
Сообщений: 157
21.09.2014, 12:28
я с парсерами xml давно уже не сталкивался, поэтому не вникал,
в туториалах по SAXParser обычно примеры должны быть не сложнее этого
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
21.09.2014, 14:10

Не по теме:

Цитата Сообщение от Настена12 Посмотреть сообщение
Если это шутка, то я не понял ее
It's a trap!


Цитата Сообщение от Настена12 Посмотреть сообщение
заметил, что девочкам быстрее помогают
Нет, обычно просто смотрят на название темы и если заинтересовало то отвечают.
Цитата Сообщение от Настена12 Посмотреть сообщение
по моей проблеме есть мысли?
Да, есть: фигнёй ты занимаешься Нас... Вася, в твоём случае можно не заморачиваться толком с парсером:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Main{
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        SAXFieldCollector collector = new SAXFieldCollector();
        XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
        reader.setContentHandler(collector);
        reader.parse(new InputSource(new FileInputStream("input.xml")));
        collector.getValues().forEach(System.out::println);
    }
}
 
class SAXFieldCollector extends DefaultHandler{
    private List<String> values;
 
    @Override
    public void startDocument() throws SAXException {
        values = new ArrayList<String>();
    }
 
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String content = new String(ch, start, length).trim();
        if(content.length() > 0)
            values.add(content);
    }
 
    public List<String> getValues(){
        return values;
    }
}
Добавлено через 4 минуты
Цитата Сообщение от Настена12 Посмотреть сообщение
Запись в файл у меня происходит в методе characters, но проблема в том, что выходной файл пуст!
Если бы кто-то был внимательнее и таки прочитал мануал ну или хотябы прошёлся отладчиком или уж хоть system.out вписал чтобы увидеть что когда вызвалось, вместо того чтобы называться женскими именами на форумах программистов, то заметил бы когда вызываеться characters так что ответ на твой вопрос: последний его вызов с пустым сообщением для закрывающего note затирает всё, но тем не менее твой подход всё равно не жизнеспособный, если бы этого вызова не было то в файле был бы текст последнего body что тоже не решило бы задачу.
1
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 9
21.09.2014, 14:14  [ТС]
Gepar, Ну ребят..ну столько шумихи из-за никнейма. Спасибо, за Ваш ответ! Буду думать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.09.2014, 14:14
Помогаю со студенческими работами здесь

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon Donovan, 150, A Hulk Hogan , 100, M Duke Nukem, 50,...

Парсинг+вывод
Есть страница &quot;http ://meteo - liman. bl .ee/index2&quot;, необходимо её спарсить и данные вывести на экран. Парсинг: Document doc =...

Парсинг XML и вывод на консоль
Приветствую.Проблема такова:есть xml-файл.Надо вывести все его &quot;чистое&quot; содержимое,без всяких &quot;&lt;xxx&gt;&lt;/xxx&gt;&quot;.Делаю...

Парсинг строки и вывод в массив
Доброго дорогие форумчане, вот моя проблема столкнулся с такой проблемой, у меня в базе есть картинки вида...

Парсинг JSON и вывод в Label
Принцип &gt; 1) Кнопка &quot;Отправить&quot;: Отправленный POST запрос вывожу в Memo 2) Кнопка &quot;Сохранить&quot;: Сохраняю Memo в файл 3)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru