2016-02-03 23 views
3

我需要生成和XML像下面的代碼片段從的firstName中間名,其中除了lastName的會有很多(約50)球員的元素。對於這個XML,我需要使用POJO來使用JAXB生成XML。因爲玩家元素不僅具有值,而且具有屬性,並且根據我的理解,我不能在基本類型的玩家類中聲明屬性,而是每個元素都是一個類。如何以及應該使用什麼批註修改的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屬性賦予'Property'標籤的名稱,該屬性是Property類中的'Name'屬性的值,而不是具有兩個子元素viz。 '名稱'和'值'只有'值'的值出現在那裏。我的意思是如何這可能得到

<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的類,在coninue之前刪除所有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如何工作KS和你只想知道如何把任意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; 
    } 
} 

最後,其主要方法加上分步類(只是爲了測試我們的代碼)

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)); 
    } 

} 
相關問題