2012-05-10 5 views
2

개체가 두 개 있다고 가정 해 봅시다. 두 개, A와 B가 같은 클래스의 개체입니다. 나는 JAXB를 사용하여 이러한 개체를 마샬링 할 필요 출력 XML이 형식이어야합니다 :JAXB 출력 형식을 지정하는 데 도움이 필요합니다.

<Root> 
    <A> 
     <ID> an id </ID> 
    </A> 
    <B> 
     <ID> an id </ID> 
    </B> 
</Root> 

<!-- Then all A and B attributes must be listed !--> 
<A> 
    <ID> an id </ID> 
    <attribute1> value </attribute1> 
    <attribute2> value </attribute2> 
</A> 
<B> 
    <ID> an id </ID> 
    <attribute1> value </attribute1> 
    <attribute2> value </attribute2> 
</B> 

어떻게 JAXB에서이 형식을 생성하기 위해? 어떤 도움을 주셔서 감사합니다.

업데이트 : 더 구체적으로, 우리는이 같은 인간의 클래스가 가정 :

@XmlRootElement 
public class Human { 
    private String name; 
    private int age; 
    private Integer nationalID; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public Integer getNationalID() { 
     return nationalID; 
    } 

    public void setNationalID(Integer nationalID) { 
     this.nationalID = nationalID; 
    } 
} 

을 우리의 주요 클래스 것은 :

public class Main3 { 

    public static void main(String[] args) throws JAXBException { 
     Human human1 = new Human(); 
     human1.setName("John"); 
     human1.setAge(24); 
     human1.setNationalID(Integer.valueOf(123456789)); 

     JAXBContext context = JAXBContext.newInstance(Human.class); 
     Marshaller m = context.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

     StringWriter stringWriter = new StringWriter(); 

     m.marshal(human1, stringWriter); 

     System.out.println(stringWriter.toString()); 
    } 

} 

그런 다음 출력은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<human> 
    <age>24</age> 
    <name>John</name> 
    <nationalID>123456789</nationalID> 
</human> 

출력이 필요합니다. 이 같은 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<human> 
    <nationalID>123456789</nationalID> 
</human> 
<human> 
    <nationalID>123456789</nationalID> 
    <age>24</age> 
    <name>John</name> 
</human> 

그리고이 날 (전용 ID로) 속성을 다음하지만 나무 아래의 모든 정의하지 않고 XML 객체의 트리를 그리는 데 도움이 될 것입니다. JAXB 또는 다른 구현을 사용하여이 작업을 수행 할 수 있습니까?

답변

8

이 시도 :

import java.io.StringWriter; 
import javax.xml.bind.Marshaller; 

... 

Object requestObject = ... // This is the object that needs to be printed with indentation 
Marshaller marshaller = ... 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
StringWriter stringWriter = new StringWriter(); 
marshaller.marshal(requestObject, stringWriter); 

System.out.println(stringWriter.toString()); 
+0

될 것입니다 불행하게도 이것이 내가 각 노드는 속성의 포함으로 이것은 XML을 생성 할 필요 없습니다. 나는 나에게 질문을 더 분명하게 업데이트했다. (나의 나쁜, 미안). –

+0

jaxb를 사용하여 수행하려는 작업에 대한 솔루션이 없다고 생각합니다. 이름 지정이 너무 엄격하기 때문입니다. 어떻게 XML을 사용할 것인가? 아마도 다른 파서로 XML을 생성 할 수 있을지 모르지만, 최악의 시나리오에서는이 작업 만하는 파서를 직접 만들 수있다. 예상 한대로 만들려고했지만 추가 태그 및/또는 네임 스페이스에서만 가능합니다. – pXel

+0

답장을 보내 주셔서 감사합니다. 내가 사용한 여분의 태그를 알려주십시오. 필요한 모든 태그를 사용할 수 있습니다. 또한 당신이 생각하는 다른 파서는이 문제를 해결하는 데 도움이 될 것입니다. 솔루션은 이름 지정에 엄격 할 필요는 없지만 ID 만 사용하여 개체 트리를 만들어야하며 개체의 특성이 트리 아래에 있어야합니다. 이것이 유일한 유일한 것입니다. 너에게 –

3
package com.namasoft.dms.gui.common.utilities; 

import java.io.StringWriter; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.annotation.XmlAccessorOrder; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlID; 
import javax.xml.bind.annotation.XmlIDREF; 
import javax.xml.bind.annotation.XmlRootElement; 

public class JAXB 
{ 

    public static class Human 
    { 

     @XmlID 
     String id; 
     @XmlElement 
     String name; 
     @XmlElement 
     int age; 

     public Human() 
     { 
     } 

     public Human(String name) 
     { 
      this.id = this.name = name; 
      age = new Random().nextInt(); 
     } 
    } 

    @XmlRootElement 
    public static class HumansList 
    { 
     @XmlElementWrapper(name = "humanObjects") 
     @XmlElement(name = "human") 
     List<Human> humanObjects = new ArrayList<>(); 

     @XmlIDREF 
     @XmlElementWrapper(name = "humanIds") 
     @XmlElement(name = "id") 
     List<Human> humanIds = new ArrayList<>(); 

     void addHuman(Human human) 
     { 
      humanObjects.add(human); 
      humanIds.add(human); 
     } 
    } 

    public static void main(String[] args) throws JAXBException 
    { 
     HumansList list = new HumansList(); 
     Human parent1 = new Human("parent1"); 
     list.addHuman(parent1); 
     Human child11 = new Human("child11"); 
     list.addHuman(child11); 
     Human child12 = new Human("child12"); 
     list.addHuman(child12); 

     Human parent2 = new Human("parent2"); 
     list.addHuman(parent2); 
     Human child21 = new Human("child21"); 
     list.addHuman(child21); 
     Human child22 = new Human("child22"); 
     list.addHuman(child22); 

     JAXBContext context = JAXBContext.newInstance(HumansList.class); 
     Marshaller m = context.createMarshaller(); 
     StringWriter xml = new StringWriter(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 

     m.marshal(list, xml); 
     System.out.println(xml); 
    } 
} 

출력은

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<humansList> 
    <humanObjects> 
     <human> 
      <id>parent1</id> 
      <name>parent1</name> 
      <age>-486071665</age> 
     </human> 
     <human> 
      <id>child11</id> 
      <name>child11</name> 
      <age>920318383</age> 
     </human> 
     <human> 
      <id>child12</id> 
      <name>child12</name> 
      <age>-1355111983</age> 
     </human> 
     <human> 
      <id>parent2</id> 
      <name>parent2</name> 
      <age>-314154051</age> 
     </human> 
     <human> 
      <id>child21</id> 
      <name>child21</name> 
      <age>983544381</age> 
     </human> 
     <human> 
      <id>child22</id> 
      <name>child22</name> 
      <age>748252616</age> 
     </human> 
    </humanObjects> 
    <humanIds> 
     <id>parent1</id> 
     <id>child11</id> 
     <id>child12</id> 
     <id>parent2</id> 
     <id>child21</id> 
     <id>child22</id> 
    </humanIds> 
</humansList> 
+0

소품. –

관련 문제