Unmarshall with JAXB
import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlValue; public class PersonUnmarshaller { public static void main(String[] args) throws JAXBException { JAXBContext context = JAXBContext.newInstance("person"); Unmarshaller unmarshaller = context.createUnmarshaller(); Person person = (Person) unmarshaller.unmarshal(new File("person.xml")); System.out.println(person.getFirstName()); } } @XmlRootElement() @XmlType(name = "") // @XmlAccessorType(XmlAccessType.FIELD) class Person { // @XmlAttribute() private String firstName; private PersonName friend; private String lastName; public String getFirstName() { return firstName; } @XmlElement(nillable = true) // @XmlElement(required=true) public PersonName getFriend() { return friend; } // @XmlValue() // @XmlTransient public String getLastName() { return lastName; } public void setFirstName(String s) { firstName = s; } public void setFriend(PersonName friend) { this.friend = friend; } // r @XmlTransient public void setLastName(String s) { lastName = s; } } @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) class PersonName { @XmlValue private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public static void main(String[] args) throws JAXBException { PersonName pn = new PersonName(); pn.value = "foo"; JAXBContext context = JAXBContext.newInstance(PersonName.class); context.createMarshaller().marshal(pn, System.out); } }