当前位置: 首页 > 面试题库 >

如何将XML转换为java.util.Map,反之亦然

韦正业
2023-03-14
问题内容

我正在搜索轻量级API(最好是单个类)以转换

Map<String,String> map = new HashMap<String,String();

到xml,反之亦然,将XML转换回Map。

例:

Map<String,String> map = new HashMap<String,String();
map.put("name","chris");
map.put("island","faranga");

MagicAPI.toXML(map,"root");

结果:

<root>
  <name>chris</chris>
  <island>faranga</island>
</root>

然后回来:

Map<String,String> map = MagicAPI.fromXML("...");

我不想使用JAXB或JSON转换API。只需简单的情况,它就不必处理嵌套的地图或属性或其他任何内容。有什么建议么?

编辑:我创建了一个工作副本并粘贴示例。感谢fvu和Michal Bernhard。

下载最新的XStream框架,“仅核心”就足够了。

Map<String,Object> map = new HashMap<String,Object>();
map.put("name","chris");
map.put("island","faranga");

// convert to XML
XStream xStream = new XStream(new DomDriver());
xStream.alias("map", java.util.Map.class);
String xml = xStream.toXML(map);

// from XML, convert back to map
Map<String,Object> map2 = (Map<String,Object>) xStream.fromXML(xml);

不需要转换器或其他任何东西。仅xstream-xyzjar就足够了。


问题答案:

XStream!

更新:我按照评论的要求添加了编组部分。

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;

public class Test {

    public static void main(String[] args) {

        Map<String,String> map = new HashMap<String,String>();
        map.put("name","chris");
        map.put("island","faranga");

        XStream magicApi = new XStream();
        magicApi.registerConverter(new MapEntryConverter());
        magicApi.alias("root", Map.class);

        String xml = magicApi.toXML(map);
        System.out.println("Result of tweaked XStream toXml()");
        System.out.println(xml);

        Map<String, String> extractedMap = (Map<String, String>) magicApi.fromXML(xml);
        assert extractedMap.get("name").equals("chris");
        assert extractedMap.get("island").equals("faranga");

    }

    public static class MapEntryConverter implements Converter {

        public boolean canConvert(Class clazz) {
            return AbstractMap.class.isAssignableFrom(clazz);
        }

        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {

            AbstractMap map = (AbstractMap) value;
            for (Object obj : map.entrySet()) {
                Map.Entry entry = (Map.Entry) obj;
                writer.startNode(entry.getKey().toString());
                Object val = entry.getValue();
                if ( null != val ) {
                    writer.setValue(val.toString());
                }
                writer.endNode();
            }

        }

        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {

            Map<String, String> map = new HashMap<String, String>();

            while(reader.hasMoreChildren()) {
                reader.moveDown();

                String key = reader.getNodeName(); // nodeName aka element's name
                String value = reader.getValue();
                map.put(key, value);

                reader.moveUp();
            }

            return map;
        }

    }

}


 类似资料:
  • 好的,我有三个实体:主题、用户、类别、图片。用户有图片,主题有用户和类别。 我还有一个话题要讲 我可以将ModelMapper注入TopicService,并使用它进行转换,但它不能按照我的需要工作,在这种情况下,如果我试图将Topic转换为TopicDTO,在转换后的TopicDTO对象中,UserDTO和CategoryTo将为null,但在调试中,在转换之前,在Topic对象中,Catego

  • 问题内容: 我想将Java Date转换为Microsoft OLE Automation-OADate类型或想将OADa​​te转换为Java Date。OADate for Java的公式是什么?实际上,我已经在stackoverflow中进行了搜索,但是找不到答案,我得到了答案,并且想在这个社区中分享它。 例如: 43013.7659837837963 等于 EET 2017年10月5日星期

  • 问题内容: 我在文件中定义了一个Point对象,如下所示: 现在,当我使用JSON通过以下代码将对象转换为JSON时: 我收到以下错误: 如何使用JSON模块在JSON与对象之间进行转换? 问题答案: 警告会告诉您大部分错误。除非您告诉 如何处理 祝福的 引用(Perl对象),否则 仅处理非祝福的数据结构。 你可以,你可以。对于,它说: 如果为false(默认值),则编码在遇到受祝福的对象时将引发

  • 问题内容: 有没有办法将netty ByteBuf转换为String,反之亦然? 问题答案: 您可以使用转换为字符串。 您可以使用和转换为ByteBuf。

  • 问题内容: 如果我有RGB小数,例如,我该怎么做才能将其转换为CMYK? 例如: 问题答案: 这是Javascript实现的Python端口。

  • 问题内容: 是否存在将Java Date转换为XML日期字符串格式(反之亦然)的简便方法? 干杯, 安德兹 问题答案: 原始答案 我在这里猜测,“ XML日期格式”是指“ 2010-11-04T19:14Z”。它实际上是ISO 8601 格式。 您可以使用其他人建议的SimpleDateFormat,FastDateFormat或使用Joda Time 进行转换,我相信它是专门为此目的而创建的。