Java XMLDecoder читает файл в arraylist и ArrayIndexOutOfBoundsException - PullRequest
1 голос
/ 20 марта 2020

добрый день, я пытаюсь создать программу, которая читает файл XML, затем помещает его в arrayList и отображает каждое имя. Вывод пустой, имена не отображаются, как читать объекты в файле, когда это строка, и как я могу получить имена XML в массив?

import java.beans.*;
import java.io.*;
import javax.swing.JOptionPane;
import java.util.*;
import java.lang.ArrayIndexOutOfBoundsException;
public class ReadNamesFromXML
{
    public static void main(String[] args)
    {


        try {
            XMLDecoder decoder = new XMLDecoder(new
                    FileInputStream("lab10.xml")); 

            ArrayList<String> names = new ArrayList<>(); 
            System.out.println(names); 
        }
        catch (FileNotFoundException e){
            JOptionPane.showMessageDialog(null,"Not found"); 
        }
        catch(ArrayIndexOutOfBoundsException e){
            JOptionPane.showMessageDialog(null,"Not found"); 
        }
    }
}

XMl файл:

<java version="1.8.0_144" class="java.beans.XMLDecoder">
<string>Harry</string>
<string>Ron</string>
<string>Hermione</string>
<string>Luna</string>
<string>Draco</string>
<string>Neville</string>
<string>Seamus</string>
<string>Ginny</string>
<string>Fred</string>
<string>George</string>
</java>

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Поскольку в описании вашего вопроса написано "Вывод пуст" , чтобы получить вывод в список, необходимо выполнить следующие изменения в своем коде.

  1. Вам необходимо прочитайте данные из вашего xml файла, используя decoder.readObject();, это вернет вам объект, поэтому наберите его на String и добавьте в ваш ArrayList.
  2. Когда decoder.readObject(); завершится с читая и добавляя все в ArrayList, он выдаст ArrayIndexOutOfBoundsException, там изменит сообщение на "Все добавлено в список" вместо "Не найдено" , и произнесите ok , как только вы нажмете ok , он напечатает ваш список на консоли со всеми именами.
  3. Кроме того, рекомендуется закрыть все ваши streams после завершения вашей программы вы можете использовать блок finally.

    public static void main(String... args) {
    
        XMLDecoder decoder = null;
        ArrayList<String> names = null;
        String s = null;
        try {
            decoder = new XMLDecoder(new
                    FileInputStream("lab10.xml")); 
            names = new ArrayList<>(); 
            do {
                 s = (String)decoder.readObject();
                 names.add(s);
            } while(null != s);
        }
        catch (FileNotFoundException e){
            JOptionPane.showMessageDialog(null,"Not found"); 
        }catch(ArrayIndexOutOfBoundsException e){
            JOptionPane.showMessageDialog(null,"All added to list"); 
        }
        finally {
            System.out.println(names); 
            decoder.close();
        }
    }
    
0 голосов
/ 20 марта 2020

Чтобы сделать это, используя XMLDecoder , XML должен иметь формат, созданный XMLEncoder для этого конкретного объекта:

Класс XMLDecoder используется для чтения XML документов создан с использованием XMLEncoder и используется так же, как ObjectInputStream. Например, следующий фрагмент можно использовать для чтения первого объекта, определенного в документе XML, написанном классом XMLEncoder:

В вашем случае XML должен выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_242" class="java.beans.XMLDecoder">
 <object class="java.util.ArrayList">
  <void method="add">
   <string>Harry</string>
  </void>
  <void method="add">
   <string>Hermione</string>
  </void>
  <void method="add">
   <string>Ron</string>
  </void>
 </object>
</java> 

Когда у вас будет такой файл, вы можете прочитать его, используя этот код:

try (FileInputStream inputStream = new FileInputStream("lab10.xml");
             XMLDecoder decoder = new XMLDecoder(inputStream)) {
            @SuppressWarnings("unchecked") 
            List<String> names = (List<String>) decoder.readObject();
            System.out.println(names);
        } catch (ArrayIndexOutOfBoundsException | IOException e) {
            JOptionPane.showMessageDialog(null, "Not found");
        }

Кажется, что XMLEncoder не тот, который вам нужен, поскольку вы не можете предоставить правильный формат XML. Я бы предпочел, чтобы вы использовали XMLDocument:

try {
            final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            final Document document = factory.newDocumentBuilder().parse("lab10.xml");
            final NodeList strings = document.getDocumentElement().getElementsByTagName("string");
            final List<String> names = new ArrayList<>(strings.getLength());
            for (int i = 0; i < strings.getLength(); i++) {
                names.add(strings.item(i).getTextContent());
            }
            System.out.println(names);
        } catch (ArrayIndexOutOfBoundsException | IOException e) {
            JOptionPane.showMessageDialog(null, "Not found");
        } catch (ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...