如何将HashMap的键设置为XML文件中的标签?

原来的问题:所以我有一个大的Excel表格,有一堆标签附加值,认为Party_Name是“IBM”是在特定的单元格中的值的标签。 我已经把它们全部读入HashMap中,键是标签,值是单元格的值(都是Stringtypes)。 事情是,我希望能够将每个绑定为一个XML标记,以便它将显示在Web浏览器中,当我指向一个党的具体path。 是否有可能dynamic设置这些XML元素,因为它会很难静态地制作100 +标签?

更新:我已经能够读取一个Excel表格的所有标签/值到一个HashMap,然后将其转换为一个AdaptedMap,允许dynamic显示哈希表中的每个条目的值/键。 事情是丑陋的,格式目前是这样的

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

注意:我在这里是新来的,所以在跟上上一个问题时我不确定礼节。 无论如何,这里是原始问题的链接

如何dynamic设置XML注释

注2:我很喜欢用xml注释,所以如果有什么明显的错误,这是因为我一直在复制,而不是逻辑的理解。 我已经试过阅读javadoc,但还不完全清楚,可能源于我对xml缺乏经验

以下是更正的例子。

Java模型(方)

@XmlJavaTypeAdapter注释用于引用XmlAdapter实现类。 我们还将使用MOXy的@XmlPath注释来消除所需的父元素(请参阅: http : @XmlPath )。

 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允许您将对象转换为其他types,以用于编组/解组。 在这个例子中,我们将使用它来将Map转换为能够利用MOXy的@XmlVariableNode扩展的对象结构(请参阅: http : @XmlVariableNode -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.properties

要将MOXY指定为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中/输出

下面是运行演示代码的input和输出。

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

了解更多信息