【问题标题】:how to deserialize a list of emails on a xml file in Java?如何反序列化 Java 中 xml 文件上的电子邮件列表?
【发布时间】:2013-01-21 12:07:55
【问题描述】:

我有一个应用程序可以输出包含电子邮件内容的 XML 文件。此 XML 文件将由不同的应用程序解析并发送电子邮件。验证应用程序发送电子邮件的部分。

实际发送邮件的方法是这样的:

public void sendEmail(List<String> toRecipients, List<String> ccRecipients, List<String> bccRecipients, String subject, String body) { 

// code.. 

}

我要发送的测试邮件应该来自这个 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<email>
  <to>
    <recipient>user1@somecompany.com</recipient>
    <recipient>user2@somecompany.com</recipient>
  </to>
  <cc>
    <recipient>user3@somecompany.com</recipient>
  </cc>
  <bcc>
    <recipient>user5@somecompany.com</recipient>
  </bcc>
  <subject>test ABC </subject>
  <body><h1>test XYZ</h1></body>
</email>

我正在使用 XStream 库,我的问题在于解析 .我尝试了几种不同的方法,但被卡住了。 XML解析方式为:

private void parseXmlFile(String xmlFilePath) {
        XStream xstream = new XStream(new DomDriver());

        xstream.alias("email", EmailPojo.class);
        xstream.alias("recipient", Recipient.class);
        xstream.alias("to", To.class);
        xstream.alias("cc", Cc.class);
        xstream.alias("bcc", Bcc.class);

        xstream.addImplicitCollection(To.class, "to", "to", Recipient.class);
        // xstream.addImplicitCollection(To.class, "to");
        // xstream.addImplicitCollection(Cc.class, "cc");
        // xstream.addImplicitCollection(Bcc.class, "bcc");

        EmailPojo emailPojo = new EmailPojo();

        StringBuilder sb = new StringBuilder();
        try {
            // filename is filepath string
            BufferedReader br = new BufferedReader(new FileReader(new File(xmlFilePath)));
            String line;

            while ((line = br.readLine()) != null) {
                sb.append(line.trim());
            }
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        List<EmailPojo> emailPojoList = new ArrayList<EmailPojo>();

        try {
            emailPojoList = (List<EmailPojo>) xstream.fromXML(sb.toString());

        } catch (Exception e) {
            emailPojo = null;// TODO: handle exception
        }
    }

这似乎很简单,但我无法做到这一点。 我在这里想念什么?这里有什么问题?

提前致谢!

编辑:忘记异常输出:

Exception in thread "main" com.thoughtworks.xstream.InitializationException: No field "to" 用于隐式收集

【问题讨论】:

  • 你应该解释哪里出了问题?例外 ?字段中出现意外字符串?突然的外星人攻击(这一次应该被安全忽略,不是吗?)?
  • 如果正文是 HTML,你会遇到问题 - 除非你知道它是格式良好的 XHTML,即使那样你也可能需要定义每个实体...
  • 隐式集合允许你的'To'类有一个带有收件人列表的'tos'字段。这不是你想要的。
  • 查看问题所在的一个好方法是在 java 中构建您想要的数据结构,然后用 xstream 对其进行序列化以查看 xml 的结构。
  • @atomman,现在就这样做! :)

标签: java xml email xstream


【解决方案1】:

行:

xstream.addImplicitCollection(To.class, "to", "to", Recipient.class);

是说To 类上有一个名为to 的集合字段,应该在其中添加Recipient 的实例。

没有看到To 类,这是一个猜测,但我认为To 类的集合字段上的字段更有可能被称为recipients,应该注册到:

xstream.addImplicitCollection(To.class, "recipients", Recipient.class);

查看xstream.addImplicitCollection(Class, String, Class)的JavaDoc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多