Чтобы сделать это, используя 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();
}