2012-08-23 27 views
1

我使用Java創建了一個包含對象樹形結構的程序。所有課程涉及實現相同的接口,每個類包含兒童名單:使用XStream創建不同對象的列表

public class MyClass1 implements MyInterface {  
    List<MyInterface> children; 
} 

public class MyClass2 implements MyInterface {  
    List<MyInterface> children; 
} 

public class MyClass3 implements MyInterface {  
    List<MyInterface> children; 
} 

.... 

現在這三個結構是在XML文件中定義:

<myclass1> 
    <myclass2></myclass2> 
    <myclass1> 
     <myclass3></myclass3> 
    </myclass1> 
</myclass1> 

樹結構可以是任何類型,由用戶定義。當然,每個類都包含我現在忽略的類特定變量。

現在我正在嘗試使用XStream將XML文件反序列化爲Java對象,最好使用註釋,但我不知道如何執行此操作。我不想最終列出每個可能的課程名單,例如在MyClass1中:

@XStreamImplicit(itemFieldName="myclass2") 
List<MyClass2> children2; 
@XStreamImplicit(itemFieldName="myclass3") 
List<MyClass3> children3; 
@XStreamImplicit(itemFieldName="myclass4") 
List<MyClass4> children4; 

有關如何使用XStream解決此問題的任何建議?或者我應該使用其他技術?

回答

0

source.xml(包含我們要加載XML):

<myclass1> 
    <myclass2></myclass2> 
    <myclass1> 
     <myclass3></myclass3> 
    </myclass1> 
</myclass1> 

接口

import java.util.List; 

public interface Myinterface { 
    List<? extends Myinterface> getChildren(); 
}  

摘要bean類(聲明兒童@XStreamImplicit):

import java.util.ArrayList; 
import java.util.List; 

import com.thoughtworks.xstream.annotations.XStreamImplicit; 

public class MyAbstract implements Myinterface { 
    @XStreamImplicit 
    private List<? extends Myinterface> children = new ArrayList<Myinterface>(); 


    public List<? extends Myinterface> getChildren() { 
     return children; 
    } 
} 

bean類(延長MyAbstract,使用@XStreamAlias使用你所需要的XML字符串):

import com.thoughtworks.xstream.annotations.XStreamAlias; 

@XStreamAlias(value="myclass1") 
public class Myclass1 extends MyAbstract { 

} 

@XStreamAlias(value="myclass2") 
public class Myclass2 extends MyAbstract { 

} 

@XStreamAlias(value="myclass3") 
public class Myclass3 extends MyAbstract { 

} 

主類(讀您的XML源文件。不要忘了processAnnotations從註釋類加載配置):

import com.thoughtworks.xstream.XStream; 

public class XStreamTest { 
    public static void main(String[] args) { 
     XStream xStream = new XStream(); 
     xStream.processAnnotations(Myclass1.class); 
     xStream.processAnnotations(Myclass2.class); 
     xStream.processAnnotations(Myclass3.class); 

     Object fromXML = xStream.fromXML(XStreamTest.class.getResourceAsStream("source.xml")); 
     System.out.println(fromXML); 
    } 
} 
+0

謝謝,這真的很有用! – Remco

+0

@Toilal你如何得到元素本身的價值?我除了' abc '以外,其餘與上述類似。我無法獲得myclass1 = abc的值 – chetank