Question

<staging>
    <stage>
        <name>aaaa</name>
        <taskName>aa</taskName>
        <taskName>qwqwse</taskName>
        <taskName>qwe</taskName>
        <iconName>asdad</iconName>
        <iconName>dasd</iconName>
    </stage>

    <stage>
        <name>dasda</name>
        <taskName>asdak</taskName>
        <taskName>dasdk1</taskName>
        <taskName>dasdask2</taskName>
        <iconName>dasdn</iconName>
        <iconName>dasdcon</iconName>
    </stage>
</staging>

And this is my java class :

@XStreamAlias("stage")
public class Stage {

private String name;
private List<String> taskName;
private List<String> iconName;
}

I am using XStream 1.4.2 to convert that XML data to Java object.

I have seen couple of SO posts but still it does not solve my problem.

Its throwing following exception:

com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: Duplicate field taskName
---- Debugging information ----
field               : taskName
class               : com.thbs.soaconnect.model.configuration.Stage
required-type       : com.thbs.soaconnect.model.configuration.Stage
converter-type      :      com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /soaConnect/staging/stage/taskName[2]
line number         : 28
class[1]            : java.util.ArrayList
converter-type[1]   :   com.thoughtworks.xstream.converters.collections.CollectionConverter
class[2]            : com.thbs.soaconnect.model.configuration.Configuration
version             : null

I tried the following way as suggested by many before :

xstream.addImplicitCollection(Stage.class,"taskName", String.class);
xstream.addImplicitCollection(Stage.class,"iconName", String.class);

Though it does not throws any exception, but it can not read the value, each element has.

Can you please help me.

Was it helpful?

Solution

The answer is right there in the debug information

Duplicate field taskName
path                : /soaConnect/staging/stage/taskName[2]

UPDATE:

Looking at this answer I think you are missing some annotations

    @XStreamAlias("stage")
    public class Stage {

    private String name;

    @XStreamImplicit(itemFieldName="taskName")
    private List<String> tasks;

    @XStreamImplicit(itemFieldName="iconName")
    private List<String> icons;
    }

OTHER TIPS

You do not have to add anything inside your Stage class. Just add proper alias to your Stage class and then use addImplicitCollections.

XML Input :
<stage>
        <name>dasda</name>
        <taskName>asdak</taskName>
        <taskName>dasdk1</taskName>
        <taskName>dasdask2</taskName>
        <iconName>dasdn</iconName>
        <iconName>dasdcon</iconName>
 </stage>

Code for Stage Class :
public class Stage {

private String name;
    private List<String> taskName;
    private List<String> iconName;
}

Code to retrieve parse XML using xtream object :
Xstream.alias("stage", Stage.class);
Xstream.addImplicitCollection(Stage.class,"taskName",String.class);
Xstream.addImplicitCollection(Stage.class,"iconName",String.class);

It worked for me.       
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top