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

Поиск:

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


Бывалый
*


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

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



Привет. Есть txt файл со след. содержанием:
Код

engMusic
  Anastasia-Te_Iert.mp3
  Calvin_Harris_and_Alesso_ft_Hurts-Under_Control.mp3
  Oceana-Endless_Summer_Remix.mp3
  The_Wanted-Show_Me_Love.mp3
rusMusic
   basta-feat-smoki-mo-kamennye-cvety-solovey.su.mp3
   maks-barskih-zdes-i-seychas.mp3


Мне это все надо в xml записать, вот таким образом:
Код

<Music>
   <Catalog>
        <CATALOG_NAME> engMusic </CATALOG_NAME>
        <FILE_NAME> Anastasia-Te_Iert.mp3 </FILE_NAME>
        <FILE_NAME> Calvin_Harris_and_Alesso_ft_Hurts-Under_Control.mp3</FILE_NAME>
        <FILE_NAME> Oceana-Endless_Summer_Remix.mp3</FILE_NAME>
        <FILE_NAME> The_Wanted-Show_Me_Love.mp3 </FILE_NAME>
   </Catalog>
   <Catalog>
        <CATALOG_NAME> rusMusic </CATALOG_NAME>
        <FILE_NAME> basta-feat-smoki-mo-kamennye-cvety-solovey.su.mp3</FILE_NAME>
        <FILE_NAME> maks-barskih-zdes-i-seychas.mp3</FILE_NAME>
   </Catalog>
</Music>


Я использую DOM, вот код:
Код

public class ConvertToXML {
    
    BufferedReader in;
    StreamResult out;
    
    Document xmlDoc;
    Element root;
    
    public void convertToXml() {
        
        try {
            in = new BufferedReader(new FileReader("content.txt"));
            out = new StreamResult("dir.xml");
            initXML();
            
            String str;
            while ((str = in.readLine()) != null) {
                process(str);
            }
            in.close();
            writeXML();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    } 
    
    public void initXML() throws ParserConfigurationException {
        
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        DOMImplementation impl = dBuilder.getDOMImplementation();
        
        xmlDoc = impl.createDocument(null, "Music" , null);
        root = xmlDoc.getDocumentElement();
    }
    
    public void process(String s) {
        
        String[] elements = s.split("\\r?\\n");
        
        Element e0 = xmlDoc.createElement("CATALOG");
        
        Element e1 = xmlDoc.createElement("CATALOG_NAME");
        Node n1 = xmlDoc.createTextNode(elements[0]);
        e1.appendChild(n1);

        Element e2 = xmlDoc.createElement("FILE_NAME");
        Node n2 = xmlDoc.createTextNode(elements[1]);
        e1.appendChild(n2);
        
        e0.appendChild(e1);
        e0.appendChild(e2);
        root.appendChild(e0);
    }
    
    public void writeXML() throws TransformerConfigurationException, TransformerException {
        
        DOMSource domSource = new DOMSource(xmlDoc);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yse");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        
        //pretty output
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
        transformer.setOutputProperty(OutputKeys.INDENT, "yse");
        transformer.transform(domSource, out);
    }
}


Проблема в том, что в process() выскакивает Exception: ArrayIndexOutOfBoundsException: 1. Я так понял это я обращаюсь к элементу которого не существует или который выходит за пределы, но не пойму почему это выдает то? Там же вроде все на своих местах

Буду рад любому совету smile
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
Michael.de
Дата 23.10.2014, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ioManip, когда вылетает ArrayIndexOutOfBoundsException, что выдаёт следующий код, размещённый в 40 строке?
Код

System.out.println("String: '"+s+"',\tarray length: "+elements.length);

PM MAIL   Вверх
ioManip
Дата 23.10.2014, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Michael.de, Вот это
Код

String: 'engMusic',    array length: 1

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
Michael.de
Дата 23.10.2014, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ioManip: правильно. А теперь посмотри на 48 строку:
Код
Node n2 = xmlDoc.createTextNode(elements[1]);

где ты обращаешся ко второму элементу... но его не существует. Отсюда и ArrayIndexOutOfBoundsException

P.S. А вообще логика программы не верна:
Код

while ((str = in.readLine()) != null) {
  process(str);
}

Зачем считывая построчно файл каждый раз вызывать ф-цию process(), передавая ей в качестве параметра одну строку?

Это сообщение отредактировал(а) Michael.de - 23.10.2014, 20:44
PM MAIL   Вверх
ioManip
Дата 24.10.2014, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Michael.de @  23.10.2014,  20:33 Найти цитируемый пост)
Зачем считывая построчно файл каждый раз вызывать ф-цию process(), передавая ей в качестве параметра одну строку?

Ну честно говоря, я это примерчик в интернете нашел и под свои нужды его использовал. Хмм, ну а если к примеру все содержимое файла занести в массив и затем это массив передавать в process() ? Это верно будет?
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
ioManip
Дата 26.10.2014, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Michael.de,  Ну вот смотрите, к примеру я буду использовать коллекцию ArrayList

Код

            String str;
            ArrayList<String> content = new ArrayList<>();
            
            while ((str = in.readLine()) != null) {
                content.add(str);
            }
            
            process(content);

И передавать ее в process()
Код

private void process(ArrayList<String> elements) {
        
//        String[] elements = s.split("\\r?\\n");
        
        for (int i = 0; i < elements.size(); i++) {
            System.out.println(elements.get(i));
        }
        
        Element e0 = xmlDoc.createElement("CATALOG");
        
        Element e1 = xmlDoc.createElement("CATALOG_NAME");
        Node n1 = xmlDoc.createTextNode(elements.get(0));
        e1.appendChild(n1);

        Element e2 = xmlDoc.createElement("FILE_NAME");
        Node n2 = xmlDoc.createTextNode(elements.get(1));
        e1.appendChild(n2);
        
        e0.appendChild(e1);
        e0.appendChild(e2);
        root.appendChild(e0);
    }

Но у меня тогда что то странное выводит
Код

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Music>
  <CATALOG>
     <CATALOG_NAME>engMusic Anastasia-Te_Iert.mp3</CATALOG_NAME>
    <FILE_NAME/>
  </CATALOG>
</Music>


Это сообщение отредактировал(а) ioManip - 26.10.2014, 05:44
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
Michael.de
Дата 28.10.2014, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ioManip, Попробуй изменить следующий работающий пример под свои нужды:
Код

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class XML_Maker {

    public static void main(String[] args) {
        String sourceFile="input.txt", targetFile="output.xml", path=new File("").getAbsolutePath();
        String fullSourceFileName=path+File.separatorChar+sourceFile;
        String fullTargetFileName=path+File.separatorChar+targetFile;
        String newLine=System.lineSeparator();

        StringBuilder sb=new StringBuilder();
        sb.append("<Music>"+newLine+"<Catalog>"+newLine);

        try {
            BufferedReader br = new BufferedReader(new FileReader(fullSourceFileName));
            String line = br.readLine();
            while (line != null) {
                line = (line.charAt(0)==32) ? "<FILE_NAME>"+line.substring(2)+"</FILE_NAME>" : "<CATALOG_NAME>"+line+"</CATALOG_NAME>";
                sb.append(line+newLine);
                line=br.readLine();     
            }
            br.close();
        }
        catch (IOException e) {e.printStackTrace();}

        sb.append("</Catalog>"+newLine+"</Music>");
        try {
            FileWriter fw=new FileWriter(fullTargetFileName);
            BufferedWriter bw=new BufferedWriter(fw);
            bw.write(sb.toString());
            bw.close();
        }
        catch (IOException e) {e.printStackTrace();}
    }
}

PM MAIL   Вверх
ioManip
Дата 30.10.2014, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Michael.de, Спасибо, за пример и за помощь. 
--------------------
Мечты не работают, пока ты не работаешь! 
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.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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