2016-02-03 1 views
3

мне нужно генерировать и XML, как в ниже фрагменте кода, где помимо ПгвЬЫате, MiddleName и LastName будет много (около 50) элементы для игрока. Для этого XML мне нужно иметь POJO, которые будут использоваться для генерации XML с использованием JAXB. Поскольку элементы игрока не только имеют значения, но также имеют атрибут, и, согласно моему пониманию, я не могу объявлять свойства внутри классов игроков примитивных типов, а каждый элемент будет классом.Как и то, что аннотации должны быть использованы для изменения POJO, чтобы получить необходимые XML

<Players> 
    <Player> 
     <FirstName id="001">Mahendra</FirstName> 
     <MiddleName id="002">Singh</MiddleName> 
     <LastName id="003">Dhoni</LastName> 
    </Player> 
</Player> 

Но я не хочу, чтобы создать эти 50 классов, а я думаю, иметь единственный класс, который может быть использован для этих всех свойств для игрока, но в этом случае генерируется XML будет выглядеть следующим образом:

<Players> 
    <Player> 
     <Property id="001"> 
      <Name>FirstName</Name> 
      <Value>Mahendra</Value> 
     </Property> 
     <Property id="002"> 
      <Name>MiddleName</Name> 
      <Value>Sing</Value> 
     </Property> 
     <Property id="003"> 
      <Name>LastName</Name> 
      <Value>Dhoni</Value> 
     </Property> 
    </Player> 
</Player> 

Что именно я хочу здесь, так это способ присвоения имени тегу «Свойство» значению свойства «Имя», которое находится внутри класса Property и вместо двух дочерних элементов. «Имя» и «Значение» отображаются только значение «Значение». Я имею в виду, как это такое возможно, чтобы получить

<FirstName id="001">Mahendra</FirstName> 

кроме

<Property id="001"> 
    <Name>FirstName</Name> 
    <Value>Mahendra</Value> 
</Property> 

с наличием POJO как:

  • Players.java

    class Players { List<Player> player; //and getter setter }

  • Player.java

    class Player { List<Property> property; // and getter setter }

  • Property.java

    class Property { String name; String value; String id; }

Я не использовал любую аннотацию здесь, потому что мне нужно знать, что поставить там, чтобы получить то, что я хотеть. :)

+0

вы можете определите свои пользовательские аннотации для обоих элементов и атрибутов, которые также могут использоваться для сериализации Xmls. – ManthanB

ответ

0

К этому времени вы, вероятно, уже решили это, положите упражнение, и у меня было свободное время.

Создайте класс в пакете com.quick с именем StepByStep, удалите весь сгенерированный IDE код (пустым файлом), прежде чем вы начнете.

Сначала добавьте пакет снова

package com.quick; 

сначала добавить импорт

import java.io.*; 
import java.util.*; 

import javax.xml.bind.*; 
import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.*; 
import javax.xml.parsers.*; 

import org.w3c.dom.*; 
import org.w3c.dom.Element; 

Теперь добавьте некоторые до классы

class Player {List<Property> property = new ArrayList<>();} 

class Property { 
    String id, name, value; 
    public Property(String id, String name, String value) { 
     this.id = id; 
     this.name = name; 
     this.value = value; 
    } 
} 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) // or write the get and set methods 
class Players { 
    @XmlJavaTypeAdapter(PlayerTypeAdapter.class) // dont worry about this line 
    List<Player> player; 
} 

Теперь добавьте класс XMLAdapter (PlayerTypeAdapter), это самая важная часть, если вы уже знаете, как @XmlJavaTypeAdapter wor кс и вы только хотите знать, как поставить произвольный XML внутри элемента фокус здесь

class PlayerTypeAdapter extends XmlAdapter<Object, Player> { 

    private DocumentBuilder documentBuilder; 

    public PlayerTypeAdapter() { 
     try { 
      documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     } catch (Exception e) { 
     } 
    } 

    @Override 
    public Player unmarshal(Object v) throws Exception { 
     Player p = new Player(); 
     NodeList c = ((Element) v).getChildNodes(); 
     for (int i = 0; i < c.getLength(); i++) { 
      Node n = c.item(i); 
      if (!(n instanceof Element)) continue; 
      Element e = (Element) n; 
      p.property.add(new Property(e.getAttribute("id"), 
       e.getTagName(), e.getTextContent())); 
     } 
     return p; 
    } 

    @Override 
    public Object marshal(Player v) throws Exception { 
     Document document = documentBuilder.newDocument(); 
     Element root = document.createElement("dummy"); 
     if (v.property != null) for (Property p : v.property) { 
      Element propertyNode = document.createElement(p.name); 
      propertyNode.setAttribute("id", p.id); 
      propertyNode.setTextContent(p.value); 
      root.appendChild(propertyNode); 
     } 
     return root; 
    } 
} 

И, наконец, добавить класс StepByStep с его основным методом (просто чтобы проверить наш код)

public class StepByStep { 

    public static void main(String[] args) throws JAXBException { 

     // context, marshaller and unmarshaller 
     JAXBContext context = JAXBContext.newInstance(Players.class, Player.class, Property.class); 
     Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     Unmarshaller unmarshaller = context.createUnmarshaller(); 

     // lets fill dummy players 
     Players p = new Players(); 
     p.player = new ArrayList<>(); 
     for (int i = 0; i < 3; i++) { 
      Player e = new Player(); 
      e.property.add(new Property("001", "FirstName", "Mahendra")); 
      e.property.add(new Property("002", "MiddleName", "Sing")); 
      e.property.add(new Property("003", "LastName", "Dhoni")); 
      p.player.add(e); 
     } 

     // marshal p (original) 
     ByteArrayOutputStream os1 = new ByteArrayOutputStream(); 
     marshaller.marshal(p, os1); 
     byte[] ba1 = os1.toByteArray(); 

     Players q = (Players) unmarshaller.unmarshal(new ByteArrayInputStream(ba1)); 

     // marshal q (copy) 
     ByteArrayOutputStream os2 = new ByteArrayOutputStream(); 
     marshaller.marshal(q, os2); 
     byte[] ba2 = os2.toByteArray(); 

     // both q and p should be the same 
     System.out.println(new String(ba1)); 
     System.out.println(new String(ba2)); 
    } 

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