2012-05-10 4 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? Любая помощь приветствуется.

Update: Чтобы быть более конкретным, Предположим, что мы имеем Человеческий класс как это:

@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> 

И это поможет мне нарисовать дерево объектов XML без атрибутов (только по ID), а затем, но все определения ниже дерева. Возможно ли использование 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, возможно, вы можете сгенерировать его с помощью другого синтаксического анализатора, или в худшем случае вы можете создать свой собственный парсер, который выполняет именно эту задачу. Я пытался создать то, что вы ожидаете, но это возможно только с дополнительными тегами и/или пространствами имен. – pXel

+0

Большое спасибо за ваш ответ. Не могли бы вы рассказать мне, какие дополнительные теги вы использовали? Я могу использовать любые теги, которые мне нужны. Также, что другие парсеры, которые вы думаете, помогут мне решить эту проблему? Решение не обязательно должно быть строгим в отношении именования, но оно должно создавать дерево объектов, используя только там идентификаторы, а атрибуты объектов должны быть ниже дерева, это единственное, что имеет значение. –

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

реквизит для вас, сэр. –

Смежные вопросы