2013-07-03 36 views
2

原題: 所以我有一個有一堆與連接到它們的值標籤的大Excel工作表,認爲Party_Name是與「IBM」是在特定的單元格的值的標籤。我讀過他們都到一個HashMap,鍵爲標籤和值是單元(包括String類型)的值。事情是,我希望能夠給每個綁定的XML標記,以便它會在Web瀏覽器,當我將它指向一個締約方的具體路徑顯示。是否可以動態設置這些xml元素,因爲靜態製作100多個標籤會很痛苦?如何將HashMap的鍵設置爲XML文件中的標籤?

更新:我已經能夠讀取Excel表格中的所有標籤/值到HashMap中,然後將其轉換爲AdaptedMap,以便動態顯示hashpmap中每個條目的值/鍵。事情是它是醜陋的,該格式目前像現在這樣

<Party> 
    <entry> 
    <key> PARTY_NAME> </key> 
    <value> IBM </value> 
    </entry> 
    <entry> 
    <key> id </key> 
    <value> 123456 </value> 
    ...etc 

我想格式化,這樣更有像這樣

<Party> 
    <entry> 
    <PARTY_NAME> IBM </PARTY_NAME> 
    </entry> 
    <entry> 
    <id> 123456 </id> 
    etc... 

甚至擺脫了「項」標籤。任何人都知道如何做到這一點?這裏是我的相關代碼:

package pojo; 

import java.util.HashMap; 
import java.util.Map; 
import java.io.File; 
import javax.xml.bind.*; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.eclipse.persistence.jaxb.MarshallerProperties; 

@XmlRootElement(name="Party") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Party { 

HashMap <String,String> partyInfo = new HashMap<String,String>(); 

public HashMap<String,String> getPartyInfo() throws Exception 
{ 
    MapAdapter adapter = new MapAdapter(); 
    adapter.marshal(partyInfo); 
    return partyInfo; 
} 

而這裏的涉及同樣的問題(鏈接在頁面底部)

package pojo; 
import java.util.*; 
import java.util.Map.Entry; 
import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 
import org.eclipse.persistence.oxm.annotations.XmlVariableNode; 

public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>>{ 

public static class AdaptedMap 
{ 
    @XmlVariableNode("key") 
    List<AdaptedEntry> entries = new ArrayList<AdaptedEntry>(); 
} 

public static class AdaptedEntry 
{ 
    @XmlTransient 
    public String key; 

    @XmlValue 
    public String value; 
} 
@Override 
public AdaptedMap marshal(Map<String,String> map) throws Exception 
{ 
    AdaptedMap adaptedMap = new AdaptedMap(); 
    for(Entry<String, String> entry : map.entrySet()) 
    { 
     AdaptedEntry adaptedEntry = new AdaptedEntry(); 
     adaptedEntry.key= entry.getKey(); 
     adaptedEntry.value=entry.getValue(); 
     adaptedMap.entries.add(adaptedEntry);   
    } 
    return adaptedMap; 
} 

需要注意的是,我從我剛纔的問題採取了類:我是新來的,所以我在回答上一個問題時,對禮節不確定。在任何情況下,這裏的鏈接,原來的問題

How to set xml annotations dynamically?

注2:我很nooby使用XML註解,如果有什麼是錯得離譜,那是因爲它的一些我已經複製,而不是理解邏輯。我試着閱讀它的javadoc,但它不是完全清楚,可能從我的經驗不足的XML以及

回答

2

下面是糾正例如干。

Java模型(甲方)

@XmlJavaTypeAdapter註解用來引用XmlAdapter實現類。我們也將使用莫西的@XmlPath註釋,以消除被要求父元素(參見:http://blog.bdoughan.com/2010/07/xpath-based-mapping.html)。

package pojo; 

import java.util.HashMap; 
import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name = "Party") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Party { 

    @XmlPath(".") 
    @XmlJavaTypeAdapter(MapAdapter.class) 
    HashMap<String, String> partyInfo = new HashMap<String, String>(); 

} 

XmlAdapter(MapAdapter)

一種XmlAdapter讓你轉換一個目的是一種不同類型的用於編組/解組的目的。在這個例子中,我們將用它來一個Map轉換爲對象的結構,是能夠利用莫西的@XmlVariableNode擴展(參見:http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html)。 @XmlVariableNode使您能夠從對象的字段/屬性派生節點名稱。

package pojo; 

import java.util.*; 
import java.util.Map.Entry; 
import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 
import org.eclipse.persistence.oxm.annotations.XmlVariableNode; 

public class MapAdapter extends 
     XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>> { 

    public static class AdaptedMap { 
     @XmlVariableNode("key") 
     List<AdaptedEntry> entries = new ArrayList<AdaptedEntry>(); 
    } 

    public static class AdaptedEntry { 
     @XmlTransient 
     public String key; 

     @XmlValue 
     public String value; 
    } 

    @Override 
    public AdaptedMap marshal(Map<String, String> map) throws Exception { 
     AdaptedMap adaptedMap = new AdaptedMap(); 
     for (Entry<String, String> entry : map.entrySet()) { 
      AdaptedEntry adaptedEntry = new AdaptedEntry(); 
      adaptedEntry.key = entry.getKey(); 
      adaptedEntry.value = entry.getValue(); 
      adaptedMap.entries.add(adaptedEntry); 
     } 
     return adaptedMap; 
    } 

    @Override 
    public Map<String, String> unmarshal(AdaptedMap adaptedMap) 
      throws Exception { 
     List<AdaptedEntry> adaptedEntries = adaptedMap.entries; 
     Map<String, String> map = new HashMap<String, String>(
       adaptedEntries.size()); 
     for (AdaptedEntry adaptedEntry : adaptedEntries) { 
      map.put(adaptedEntry.key, adaptedEntry.value); 
     } 
     return map; 
    } 

} 

jaxb。性能

要指定莫西爲您的JAXB提供你需要包括一個名爲在同一個包jaxb.properties與下面進入你的領域模型文件(見:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

package pojo; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Party.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/pojo/input.xml"); 
     Party party = (Party) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(party, System.out); 
    } 

} 

input.xml中/輸出

下面是輸入和輸出從運行演示代碼。

<?xml version="1.0" encoding="UTF-8"?> 
<Party> 
    <id> 123456 </id> 
    <PARTY_NAME> IBM </PARTY_NAME> 
</Party> 

更多信息

+1

很大,這正是我一直在尋找謝謝! – sreya

+0

你的例子很棒thx我只有一個問題。我也使用jackson庫,它看起來傑克遜不使用XmlJavaAdapter註釋,派對元素簡單地從輸出中丟失。如果我註釋掉XmlJavaAdapter註釋對象存在,但不是以適當的形式。你有什麼想法爲什麼發生這種情況? –

相關問題