阅读(2808) (0)

Spring教程 - 弹簧对象 - XML映射

2017-01-09 19:06:19 更新

Spring教程 - 弹簧对象 - XML映射


以下代码显示了如何使用Castor进行Java对象到XML映射。

项目依赖

要使用脚本,请将以下依赖项添加到pom.xml文件。

    <properties>
    <spring.version>3.0.5.RELEASE</spring.version>
  </properties>

  <dependencies>

    <!-- Spring 3 dependencies -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- spring oxm -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- Uses Castor for XML -->
    <dependency>
      <groupId>org.codehaus.castor</groupId>
      <artifactId>castor</artifactId>
      <version>1.2</version>
    </dependency>

    <!-- Castor need this -->
    <dependency>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
      <version>2.8.1</version>
    </dependency>

  </dependencies>


Java Bean

这里是一个简单的Java bean做xml映射

package com.www.zijiebao.common;

public class Employee {

    String name;
    int age;
    boolean trained;
    String address;
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public int getAge() {
      return age;
    }
    public void setAge(int age) {
      this.age = age;
    }
    public boolean isTrained() {
      return trained;
    }
    public void setTrained(boolean trained) {
      this.trained = trained;
    }
    public String getAddress() {
      return address;
    }
    public void setAddress(String address) {
      this.address = address;
    }

}


Marshaller和Unmarshaller

以下代码处理映射通过Spring“的oxm接口:Marshaller和Unmarshaller。

package com.www.zijiebao.common;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;

public class XMLConverter {

  private Marshaller marshaller;
  private Unmarshaller unmarshaller;

  public Marshaller getMarshaller() {
    return marshaller;
  }

  public void setMarshaller(Marshaller marshaller) {
    this.marshaller = marshaller;
  }

  public Unmarshaller getUnmarshaller() {
    return unmarshaller;
  }

  public void setUnmarshaller(Unmarshaller unmarshaller) {
    this.unmarshaller = unmarshaller;
  }

  public void convertFromObjectToXML(Object object, String filepath)
    throws IOException {

    FileOutputStream os = null;
    try {
      os = new FileOutputStream(filepath);
      getMarshaller().marshal(object, new StreamResult(os));
    } finally {
      if (os != null) {
        os.close();
      }
    }
  }

  public Object convertFromXMLToObject(String xmlfile) throws IOException {

    FileInputStream is = null;
    try {
      is = new FileInputStream(xmlfile);
      return getUnmarshaller().unmarshal(new StreamSource(is));
    } finally {
      if (is != null) {
        is.close();
      }
    }
  }

}

弹簧配置

在Spring的bean配置文件中,注入CastorMarshaller作为XML绑定框架。

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <bean id="XMLConverter" class="com.www.zijiebao.common.XMLConverter">
    <property name="marshaller" ref="castorMarshaller" />
    <property name="unmarshaller" ref="castorMarshaller" />
  </bean>
  <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" />

</beans>

例子

这里是运行应用程序的代码。

package com.www.zijiebao.common;

import java.io.IOException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class App {
  private static final String XML_FILE_NAME = "customer.xml";

  public static void main(String[] args) throws IOException {
    ApplicationContext appContext = new ClassPathXmlApplicationContext("SpringBeans.xml");
    XMLConverter converter = (XMLConverter) appContext.getBean("XMLConverter");

    Employee customer = new Employee();
    customer.setName("java2s");
    customer.setAge(99);
    customer.setTrained(true);
    customer.setAddress("This is address");

    //from object to XML file
    converter.convertFromObjectToXML(customer, XML_FILE_NAME);

    //from XML to object
    Employee customer2 = (Employee)converter.convertFromXMLToObject(XML_FILE_NAME);
    System.out.println(customer2);


  }
}

上面的代码生成以下结果。

在项目根文件夹中生成以下XML文件“customer.xml"。

文件:customer.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer trained="true" age="99">
  <address>This is address</address>
  <name>java2s</name>
</customer>

Download Castor_XML_Mapping.zip

例子...

要控制哪个字段应用作属性或元素,使用Castor XML映射文件来定义Object和XML之间的关系。

以下代码创建映射文件mapping.xml。把它放到我们的项目类路径中。

<mapping>
  <class name="com.java2s.core.model.Employee">

    <map-to xml="customer" />

    <field name="age" type="integer">
      <bind-xml name="age" node="attribute" />
    </field>

    <field name="trained" type="boolean">
      <bind-xml name="trained" node="element" />
    </field>

    <field name="name" type="string">
      <bind-xml name="name" node="element" />
    </field>

    <field name="address" type="string">
      <bind-xml name="address" node="element" />
    </field>
  </class>
</mapping>

在Spring bean配置文件中,将上面的mapping.xml注入CastorMarshaller通过“mappingLocation"。

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <bean id="XMLConverter" class="com.java2s.core.XMLConverter">
    <property name="marshaller" ref="castorMarshaller" />
    <property name="unmarshaller" ref="castorMarshaller" />
  </bean>
  <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" >
    <property name="mappingLocation" value="classpath:mapping.xml" />
  </bean>

</beans>