3
<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.

flup
  • 26,937
  • 7
  • 52
  • 74
Madhusudan Joshi
  • 4,438
  • 3
  • 26
  • 42

2 Answers2

8

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;
    }
Community
  • 1
  • 1
Rakesh
  • 4,264
  • 4
  • 32
  • 58
  • Thanks, but it is not for that reason. Its trying to say you have second element of the same name, i.e `taskName`. The actual values in my project are different, but still its showing the same exception. – Madhusudan Joshi Aug 21 '13 at 11:03
  • I think it is not the element name, it is value inside the element `` - element `qwe` - value Why don't you try changing the value of the second `` ? – Rakesh Aug 21 '13 at 11:06
  • Rakesh, as i have told you, i have tried with different values here in my project, its throwing the same exception. – Madhusudan Joshi Aug 21 '13 at 11:11
  • 1
    oohoo!! Yeah it works. i had tried that `@XStreamImplicit` without providing `itemFieldName="taskName"`. thanks – Madhusudan Joshi Aug 21 '13 at 11:31
6

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.       
user1540256
  • 151
  • 2
  • 3