原始问题: 所以我有一个很大的excel表,其中有一堆标签附加了值,认为Party_Name是标签,“IBM”是该特定单元格中的值。我已将它们全部读入HashMap,其中键是标签,值是单元格的值(两者都是String类型)。事实上,我希望能够将每个绑定为XML标记,以便当我将其指向Party的特定路径时,它将显示在Web浏览器中。是否可以动态设置这些xml元素,因为静态制作100+标签会很痛苦?
更新:我已经能够将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:我对xml注释非常苛刻,所以如果有任何明显的错误,那是因为其中一些我一直在复制而不是逻辑上理解。我已经尝试过阅读它上面的javadocs,但它并不完全清楚,可能源于我对xml缺乏经验
答案 0 :(得分:1)
以下是更正的示例。
Java模型(派对)
@XmlJavaTypeAdapter
注释用于引用XmlAdapter
实现类。我们还将使用MOXy的@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
转换为能够利用MOXy的@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.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中/输出强>
以下是运行演示代码的输入和输出。
<?xml version="1.0" encoding="UTF-8"?>
<Party>
<id> 123456 </id>
<PARTY_NAME> IBM </PARTY_NAME>
</Party>
了解更多信息