2013-07-18 4 views
0

Позвольте мне начать с того, что это первый раз, когда я пытаюсь использовать xStream. Я пытаюсь проанализировать XML-файл и использовать данные для создания java-объекта. Я добавил xstream-1.4.4.jar, xpp3_min-1.1.4c.jar, xmlpull-1.1.3.1.jar и kxml2-2.3.0.jar в мои пути сборки. Я пытался следовать несколько учебников, но просто не могу понять, почему я получаю эту ошибку:xstream parser error: java.lang.ArrayIndexOutOfBoundsException: -1

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
    at com.thoughtworks.xstream.core.util.FastStack.pop(FastStack.java:42) 
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.move(AbstractPullReader.java:125) 
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.moveDown(AbstractPullReader.java:103) 
    at com.thoughtworks.xstream.io.xml.XppReader.<init>(XppReader.java:63) 
    at com.thoughtworks.xstream.io.xml.AbstractXppDriver.createReader(AbstractXppDriver.java:54) 
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:913) 
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:904) 
    at ParseTesting.Testing.main(Testing.java:10) 

файл XML выглядит следующим образом:

<?xml version="1.0" encoding="ISO-8859-1"?> 

<vblock> 
    <name>vBlock1</name> 
    <status>online</status> 
    <storage>2.2</storage> 
    <cpu>2.5</cpu> 
</vblock> 

Теперь здесь соответствующий класс для объекта Я хотел бы создать:

package ParseTesting; 

public class Vblock { 
    private String name; 
    private String status; 
    private double storage; 
    private double cpu; 

    /*public Vblock(String n, String stat, double stor, double proc){ 
     name = n; 
     status = stat; 
     storage = stor; 
     cpu = proc; 
    }*/ 

    public String getName(){ 
     return this.name; 
    } 
    public String getStatus(){ 
     return this.status; 
    } 
    public double getStorage(){ 
     return this.storage; 
    } 
    public double getCpu(){ 
     return this.cpu; 
    } 

} 

И, наконец, на самом деле разбора, что я пытаюсь:

package ParseTesting; 

import com.thoughtworks.xstream.XStream; 

public class Testing { 
    public static XStream xstream = new XStream(); 

    public static void main(String[] args){ 
     xstream.alias("vblock", Vblock.class); 
     Vblock v1 = (Vblock)xstream.fromXML("vBlock.xml"); 

     System.out.println(v1.getName()); 
    } 

} 

Я был бы признателен за понимание, которое может быть предоставлено. Большое спасибо!

ответ

1

Метод fromXML, который принимает параметр String, ожидает строку, содержащую фактический XML, который вы хотите размонтировать, а не строку, содержащую имя файла. Если вы хотите проанализировать файл, вам нужно использовать один из других методов fromXML с использованием File, URL или InputStream.

+0

Я не уверен, что вы имеете в виду здесь. Я вижу, что эти методы существуют, но я не знаю, как передать файл, Url или Inputstream. Как создать файл-объект? – unsingefou

0

@Ian

Ничего! Я сделал то, что вы мне сказали. Результат выглядит примерно так:

FileReader r = new FileReader("C:\\Users\\name\\Desktop\\visualMonitor\\vBlock.xml"); 
     xstream.alias("vblock", Vblock.class); 
     Vblock v1 = (Vblock)xstream.fromXML(r); 

Это замечательно. Спасибо!

+0

Хотя это будет ОК для конкретного файла, указанного в вопросе, следует предупредить, что файл FileReader будет работать только в том случае, если кодировка символов XML-файла совпадает с кодировкой по умолчанию на вашей платформе. Как правило, гораздо лучше использовать 'fromXML', который принимает« Файл »или« InputStream », а не тот, который принимает« Reader », поэтому анализатор XML может обнаруживать и использовать правильную кодировку для файла -' xstream. fromXML (новый файл («C: \\ Users \\ name \\ Desktop \\ visualMonitor \\ vBlock.xml»)) ' –

Смежные вопросы