Java 使用XStream创建不同对象的列表
我正在用Java创建一个包含对象树结构的程序。所有涉及的类都实现相同的接口,每个类都包含一个子类列表:Java 使用XStream创建不同对象的列表,java,xml,tree,xstream,xml-deserialization,Java,Xml,Tree,Xstream,Xml Deserialization,我正在用Java创建一个包含对象树结构的程序。所有涉及的类都实现相同的接口,每个类都包含一个子类列表: public class MyClass1 implements MyInterface { List<MyInterface> children; } public class MyClass2 implements MyInterface { List<MyInterface> children; } public class M
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解决这个问题,有什么建议吗?或者我应该使用其他技术 source.xml包含我们要加载的xml:
<myclass1>
<myclass2></myclass2>
<myclass1>
<myclass3></myclass3>
</myclass1>
</myclass1>
扩展MyAbstract的Bean类,使用@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);
}
}
谢谢,这真的很有用@你如何得到元素的值,元素本身就是一个类。我有一个类似于上面的一个,除了“abc”。我无法获取myclass1=abc的值
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 {
}
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);
}
}