【问题标题】:Converting XML into Java Map<String, Integer>将 XML 转换为 Java Map<String, Integer>
【发布时间】:2014-09-24 23:05:43
【问题描述】:

我正在尝试将 XML 转换为 Java 代码。此 XML 在不同的文件中;它匹配带有数字的单词(概率分布),如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
   <Durapipe type="int">1</Durapipe>
   <EXPLAIN type="int">2</EXPLAIN>
   <woods type="int">2</woods>
   <hanging type="int">3</hanging>
   <hastily type="int">2</hastily>
   <localized type="int">1</localized>
   <Schuster type="int">5</Schuster>
   <regularize type="int">1</regularize>
   <LASR type="int">1</LASR>
   <LAST type="int">22</LAST>
   <Gelch type="int">2</Gelch>
   <Gelco type="int">26</Gelco>
   .......
</root>

我正在尝试将其转换为 Java Map,这是我正在使用的代码:

XStream xstream = new XStream();
    @SuppressWarnings("unchecked")
    Map<String, Integer> englishCorpusProbDist = (Map<String, Integer>)xstream.fromXML(new File("LocationOfFileOnMyComputer/frequencies.xml"));

目前,每当我尝试运行上述 Java 代码时,我的控制台中都会出现以下异常:

Exception in thread "main" com.thoughtworks.xstream.mapper.CannotResolveClassException: root
at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30)
at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1185)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1169)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1133)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1075)
at ProductAttributeExtractor.main(ProductAttributeExtractor.java:23)

这是一个相关的帖子,但我的问题是增加了一层复杂性,因为我的 XML 将字符串与整数匹配,不幸的是,Java Map 不能使用整数,它必须使用整数(这非常令人沮丧):@987654321 @

您能提供的任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: java xml file-io xstream


    【解决方案1】:

    你需要注册你的 MapConverter,实现 Converter 的类

    xstream.registerConverter(new MapEntryConverter());

    希望有帮助

    【讨论】:

    • 等等...我很困惑。什么是 MapEntryConverter?它似乎不在 XStream 中...
    • 我在 XStream 文档中找到了 MapConverter,但没有找到 MapEntryConverter。
    • 开个玩笑。在这里回答:stackoverflow.com/questions/25096667/…
    • 我们在这里互相帮助。只要我的回答解决了你的问题,我就会微笑:)
    【解决方案2】:

    Underscore-java 库可以将 xml 转换为 hashmap,反之亦然。我是项目的维护者。 Live example

    代码示例:

    import com.github.underscore.lodash.U;
    
    public class Main {
        public static void main(String[] args) {
          String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
        + "<root>"
        + "   <Durapipe type=\"int\">1</Durapipe>"
        + "   <EXPLAIN type=\"int\">2</EXPLAIN>"
        + "   <woods type=\"int\">2</woods>"
        + "   <hanging type=\"int\">3</hanging>"
        + "   <hastily type=\"int\">2</hastily>"
        + "   <localized type=\"int\">1</localized>"
        + "   <Schuster type=\"int\">5</Schuster>"
        + "   <regularize type=\"int\">1</regularize>"
        + "   <LASR type=\"int\">1</LASR>"
        + "   <LAST type=\"int\">22</LAST>"
        + "   <Gelch type=\"int\">2</Gelch>"
        + "   <Gelco type=\"int\">26</Gelco>"
        + "</root>";
    
        String result = U.fromXmlWithoutAttributes(xml).toString();
        // {Durapipe=1, EXPLAIN=2, woods=2, hanging=3, hastily=2, localized=1, Schuster=5, regularize=1, LASR=1, LAST=22, Gelch=2, Gelco=26}
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2022-09-30
      • 2017-07-18
      相关资源
      最近更新 更多