2

我正在使用如下所示的 xstream api,但现在请告知我是否可以使用 API 实现相同的 xml 到 java 对象转换过程,而不是像 JAXB 这样的 java 本身中的 xstream。如果可能的话,请注意,除了使用 xstream 之外,我该如何转换它..

假设我们需要从 xml 文件加载配置:

01  <config>
02      <inputFile>/Users/tomek/work/mystuff/input.csv</inputFile>
03      <truststoreFile>/Users/tomek/work/mystuff/truststore.ts</truststoreFile>
04      <keystoreFile>/Users/tomek/work/mystuff/CN-user.jks</keystoreFile>
05   
06      <!-- ssl stores passwords-->
07      <truststorePassword>password</truststorePassword>
08      <keystorePassword>password</keystorePassword>
09   
10      <!-- user credentials -->
11      <user>user</user>
12      <password>secret</password>
13  </config>

我们想将它加载到配置对象中:

01  public class Configuration {
02   
03      private String inputFile;
04      private String user;
05      private String password;
06   
07      private String truststoreFile;
08      private String keystoreFile;
09      private String keystorePassword;
10      private String truststorePassword;
11   
12      // getters, setters, etc.
13  }

所以基本上我们要做的是:

1   FileReader fileReader = new FileReader("config.xml");  // load our xml file 
2       XStream xstream = new XStream();     // init XStream
3       // define root alias so XStream knows which element and which class are equivalent
4       xstream.alias("config", Configuration.class);   
5       Configuration loadedConfig = (Configuration) xstream.fromXML(fileReader);
4

2 回答 2

2

以下是使用JAXB (JSR-222) 的方法。JAXB 的实现包含在 Java SE 6 及更高版本中。

Java 模型 ( Configuration)

JAXB 不需要任何注释(请参阅: http ://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html ),但映射根元素@XmlRootElement确实使事情变得更容易。默认情况下,JAXB 将从公共属性派生映射,但我已经使用过@XmlAccessorType(XmlAccessType.FIELD),所以我可以排除它们,这样我就可以发布一个较小的工作类(参见: http ://blog.bdoughan.com/2011/06/using-jaxbs- xmlaccessortype-to.html )。

import javax.xml.bind.annotation.*;

@XmlRootElement(name="config")
@XmlAccessorType(XmlAccessType.FIELD)
public class Configuration {

      private String inputFile;
      private String user;
      private String password;

      private String truststoreFile;
      private String keystoreFile;
      private String keystorePassword;
      private String truststorePassword;

      // getters, setters, etc.
}

演示代码 ( Demo)

下面的演示代码会将 XML 转换为对象形式,然后将其写回 XML。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Configuration.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum19407064/input.xml");
        Configuration configuration = (Configuration) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(configuration, System.out);
    }

}

附加信息

由于您熟悉 XStream,因此我写了一篇文章,它使用 JAXB 和 XStream 映射对象模型,看看有什么区别。

于 2013-10-16T15:56:23.913 回答
0

杰克逊非常适合这一点。在最基本的情况下,您可以简单地执行以下操作:

XmlMapper mapper = new XmlMapper();
mapper.writeValue(myFile, myObject)
于 2013-10-16T15:15:18.793 回答