2013-12-14 3 views
1

JAXB 마샬링 및 언 마샬 작업을하고 있습니다. 나는 2 개의 @XmlRootElement을 위해 동일한 이름 (Person.ELEMENT_NAME)을 사용해야하는 다음과 같은 시나리오를 가지고있다.JAXB에서 여러 클래스에 대해 동일한 요소 이름을 사용할 수 있습니까?

<human> 
<type>Human Being</type> 
<person type="ReceiverPerson"> 
<name>John</name> 
<title>Professor</title> 
<gender>Male</gender> 
</person> 
<person type="SenderPerson"> 
<name>Marry</name> 
<title>Lecturer</title> 
<age>23</age> 
</person> 
<anything>I am unknown to the xml</anything> 
</human> 

내가 무슨 일인지 모르겠다하지만 난 출력 다음 얻을 :

Marshalling by creating a Human object 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<human> 
    <type>Human</type> 
</human> 

Marshalling from my own xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<human> 
    <type>Human</type> 
</human> 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<human> 
    <person> 
     <name>Marry</name> 
     <title>Lecturer</title> 
    </person> 
    <type>Human Being</type> 
    <anything>I am unknown to the xml</anything> 
</human> 

죄송 큰 예제

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class Person{ 

    public final static String ELEMENT_NAME = "person"; 

    @XmlElement 
    private String name; 
    @XmlElement 
    private String title; 
    //Getter Setter 
} 

@XmlRootElement(name = Person.ELEMENT_NAME) 
public class ReceiverPerson extends Person { 
    @XmlElement 
    private String gender; 
    //Getter Setter 
} 

@XmlRootElement(name = Person.ELEMENT_NAME) 
public class SenderPerson extends Person { 
    @XmlElement 
    private String age; 
    //Getter Setter 
} 
@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class Human { 

    @XmlElement(name = Person.ELEMENT_NAME , type = ReceiverPerson.class) 
    private ReceiverPerson rP; 
    @XmlElement(name = Person.ELEMENT_NAME , type= SenderPerson.class) 
    private SenderPerson sP; 
    @XmlElement 
    private String type; 

    @XmlAnyElement 
    private List<Object> unknown; 

    //Getter Setter 
} 

public class Test{ 
public static void main(String[] args){ 

     StringWriter sw = new StringWriter(); 
    JAXBContext jc = JAXBContext.newInstance(Human.class); 
    Marshaller marshaller = jc.createMarshaller(); 
    Unmarshaller unmarshaller = jc.createUnmarshaller(); 
    Human human2,human1; 
    String humans = "This xml is writtem after my code , because its too big"; 
    human1 = new Human(); 
    human1.setType("Human"); 
    SenderPerson sp = new SenderPerson(); 
    sp.setAge("23"); 
    sp.setName("Marry"); 
    sp.setTitle("Lecturer"); 
    ReceiverPerson rP = new ReceiverPerson(); 
    rP.setName("John"); 
    rP.setTitle("Professor"); 
    rP.setGender("Male"); 


    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(human1, sw); 
    System.out.println("Marshalling by creating a Human object"); 
    System.out.println(sw.toString()); 



    human2 = (Human) unmarshaller.unmarshal(new StringReader(sw.toString())); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(human2, sw); 
    System.out.println("Marshalling from my own xml"); 
    System.out.println(sw.toString()); 

} 
} 

테스트 클래스의 문자열 인간

는 XML을 다음있다 내 질문은 다음과 같습니다.

  1. 첫 출력물에 사람이 누락 된 이유는 무엇입니까?

  2. 왜 두 번째 출력에 age이 누락 되었습니까?

  3. 두 번째 출력이 ReceiverElement의 전체 사람에게 누락 된 이유는 무엇입니까 (John에 대한 설명)?

  4. 왜 내 두 번째 출력에 두 개의 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>이 있습니까?

  5. 또는 다른 방법을 사용하여 xml에 <person type="ReceiverPerson">과 같은 것을 사용할 수 있습니까?

  6. (생성 된 XML 후 원수 비 정렬 화) 마지막 단락의 출력은 적절한 출력을 제공하지 않으며, 출력 같다 : 어떤 이유

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <human> 
    <person> 
        <name>Marry</name> 
        <title>Lecturer</title> 
    </person> 
    <type>Human</type> 
    </human> 
    

인격 서브 클래스가 아닌 생성됩니다. 어떤 아이디어라도 제발? 왜 첫번째 출력은 사람이 없습니다 -이어야이 긴 질문

답변

1

1을 읽은 사람에 미리

감사합니다?

다음과 같은 통화 누락

:

human1.setsP(sp); 
    human1.setrP(rP); 

2 - 왜 두 번째 출력은 나이가 행방 불명입니다?

당신이 두 번째 출력에 age을 얻을 항목 하나를 해결하면 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<human> 
    <person> 
     <name>John</name> 
     <title>Professor</title> 
     <gender>Male</gender> 
    </person> 
    <person> 
     <name>Marry</name> 
     <title>Lecturer</title> 
     <age>23</age> 
    </person> 
    <type>Human</type> 
</human> 

3 - 왜 두 번째 출력 ReceiverElement (존에 대한 설명)에 대한 모든 사람이 없습니다?

항목 1을 수정하면 작동합니다.

4 - 내 두 번째 출력에는 두 가지 이유가 무엇입니까?

이 선언이 두 번 표시되지 않습니다. 데모 코드를 실행하면 두 번 표시되지 않습니다.

5 - 그것은 @XmlElement (이름 = Person.ELEMENT_NAME, 유형 = ReceiverPerson.class) 또는 다른 방법으로 에를 사용하여 XML 년대처럼 뭔가를 할 수 있습니까?

속성이 하위 클래스 수준에서 입력되므로 어떤 유형의 한정자도 필요하지 않습니다. 형식 한정자가 필요한 경우 JAXB는 xsi:type 특성을 사용합니다. 다음과 같은 흥미를 찾을 수 있습니다 :

+0

안녕 블 레즈를, 정말 감사합니다. 제 질문을 조금 편집 했어요. 좀 봐 주시겠습니까? – web2dev

관련 문제