2014-07-23 2 views
1

J'utilise jaxb pour convertir la réponse xml à l'objet java, j'ai essayé mais je reçois null pour objet de classe imbriqué.Comment unmarshall xml chaîne à l'objet en utilisant JAXB

XML Chaîne

<person> 
    <name>name</name> 
    <age>12</age> 
    <address> 
     <info> 
      <contactadress> 
       <city> 
       </city> 
       <phone> 
       </phone> 
      </contactadress> 
     </info> 
    </address> 
</person> 

classe java mapping

@XmlRootElement(name = "person") 
public class person 
{ 
    @XmlElement(name = "name") 
    String name; 

    @XmlElement(name = "age") 
    int age: 

    @XmlElement(name = "address/info/contactadress") 
    person.Address address; 

    @XmlRootElement(name = "contactadress") 
    public static class Address{ 

     @XmlElement(name = "city") 
     String city; 

     @XmlElement(name = " phone") 
     String phone; 
    } 
} 

code JAXB:

public Person parseXml(String xmlResponse, Person pserson) 
{ 

StringReader stringReader = new StringReader(xmlResponse); 
      JAXBContext jaxbContext = JAXBContext.newInstance(pserson.class); 
      XMLInputFactory xif = XMLInputFactory.newInstance(); 
      XMLStreamReader xsr = xif.createXMLStreamReader(stringReader); 
      Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
      return unmarshaller.unmarshal(xsr); 
} 

après converstion reçois objet d'adresse est nulle.

+0

où est le code jaxb? – LMK

+0

jaxb code parfaitement bien, ce mappage seulement correct – venu

+0

s'il vous plaît poster le code jaxb trop – LMK

Répondre

0

votre classe de personne devrait ressembler à ceci

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
"name", 
"age", 
"address" 
}) 
@XmlRootElement(name = "person") 
public class Person { 

@XmlElement(required = true) 
@XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
@XmlSchemaType(name = "NCName") 
protected String name; 
@XmlElement(required = true) 
protected BigInteger age; 
@XmlElement(required = true) 
protected Address address; 

/** 
* Gets the value of the name property. 
* 
* @return 
*  possible object is 
*  {@link String } 
*  
*/ 
public String getName() { 
    return name; 
} 

/** 
* Sets the value of the name property. 
* 
* @param value 
*  allowed object is 
*  {@link String } 
*  
*/ 
public void setName(String value) { 
    this.name = value; 
} 

/** 
* Gets the value of the age property. 
* 
* @return 
*  possible object is 
*  {@link BigInteger } 
*  
*/ 
public BigInteger getAge() { 
    return age; 
} 

/** 
* Sets the value of the age property. 
* 
* @param value 
*  allowed object is 
*  {@link BigInteger } 
*  
*/ 
public void setAge(BigInteger value) { 
    this.age = value; 
} 

/** 
* Gets the value of the address property. 
* 
* @return 
*  possible object is 
*  {@link Address } 
*  
*/ 
public Address getAddress() { 
    return address; 
} 

/** 
* Sets the value of the address property. 
* 
* @param value 
*  allowed object is 
*  {@link Address } 
*  
*/ 
public void setAddress(Address value) { 
    this.address = value; 
} 

} 
0

L'annotation @XmlElement ne vous permet pas de spécifier un chemin que le nom de l'élément que vous avez fait dans votre question. Au lieu de cela, vous auriez besoin de classes pour chaque niveau d'imbrication. Ces classes peuvent être exploitées via un XmlAdapter si vous le souhaitez (voir: Access attribute of internal element in the most simple way).

@XmlElement(name = "address/info/contactadress") 
person.Address address; 

En EclipseLink JAXB (MOXy) nous offrons un qui vous permet de faire l'extension @XmlPath ceci:

@XmlPath("address/info/contactadress") 
person.Address address; 

J'ai écrit plus sur ce cas d'utilisation sur mon blog:

Questions connexes