Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XStream创建不同对象的列表_Java_Xml_Tree_Xstream_Xml Deserialization - Fatal编程技术网

Java 使用XStream创建不同对象的列表

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

我正在用Java创建一个包含对象树结构的程序。所有涉及的类都实现相同的接口,每个类都包含一个子类列表:

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);
    }
}