2013-07-18 46 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解析器錯誤: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

採用String參數的fromXML方法需要包含您想要解組的實際XML的字符串,而不是包含文件名稱的字符串。如果要從文件解析,則需要使用其他fromXML方法中的一種,其中採用FileURLInputStream

+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

雖然對於您在問題中提供的特定文件,這將是正確的,但要注意,如果XML文件的字符編碼與平臺上的默認編碼相同,則「FileReader」只能在一般情況下使用。使用帶'File'或'InputStream'的'fromXML'通常好得多,而不是'Reader',所以XML解析器可以檢測和使用文件的正確編碼--xstream。 fromXML(new File(「C:\\ Users \\ name \\ Desktop \\ visualMonitor \\ vBlock.xml」))' –

相關問題