JAXBを使用してobjectとxmlの変換を完了

4096 ワード

1.xmlファイルの各ノードと属性情報を対応するJavaモデルを作成します.
2.Javaモデルでxmlファイルに対応するノードと属性を作成するには、注釈で表す必要があります.
@XmlRootElement   JavaクラスをXMLのルートノードパラメータにマッピングする:name  このルートノードの名前namespaceを定義する   このルートノードのネーミングスペースを定義するには
@XmlAccessorType  このクラスにマッピングするタイプをXMLにマッピングする必要があるかを定義します.次の4つのパラメータを受信できます.
XmlAccessType.PROPERTY:XML XmlAccessType.PUBLIC_にこのクラスのプロパティ(get/setメソッド)をマップMEMBER:このクラスのすべてのpublicのfieldまたはpropertyをXML(デフォルト)XmlAccessType.NONEに同時にマップします:@XmlElementをマップしません  フィールドまたはget/setメソッドをXMLにマッピングするノードを指定します.たとえば、クラスのXmlAccessorTypeがPROPERTYとしてマークされている場合、get/setメソッドのないフィールドに注釈をマークすると、そのフィールドをXMLにマッピングできます.パラメータ:defaultValue  ノードのデフォルト名の指定          ノード名namespaceの指定     ノードネーミングスペースの指定required     (デフォルトはfalse)nillableが必要かどうか     このフィールドにnillable=「true」プロパティ(デフォルトfalse)typeが含まれているかどうか        このフィールドまたは属性の関連タイプを定義@XmlAttribute  フィールドまたはget/setメソッドをXMLにマッピングするプロパティを指定します.パラメータ:name             属性名namespaceの指定    属性ネーミングスペースの指定required         必要かどうか(デフォルトはfalse)@XmlTransient  フィールドまたは属性を定義するには、XMLにマッピングする必要はありません.たとえば、クラスのXmlAccessorTypeがPROPERTYとしてマークされている場合、あるget/setメソッドのフィールドに注釈がマークされている場合、その属性はマッピングされません.@XmlType  マッピングに関するルール・パラメータの定義:propOrder        XMLマッピング時のノード順序factoryClassの指定     UnMarshalのマッピングクラスインスタンスを生成するために必要なファクトリクラスを指定します.デフォルトはこのクラス自体factoryMethodです.  工場クラスを指定する工場メソッドname               XML Schemaのtypeの名前の定義  namespace      Schemaのネーミングスペースを指定@XmlElementWrapper  配列要素または集合要素の親ノードを定義します.たとえば、クラスにリストitemsという要素があります.この注釈を付けないと、この要素は......とマッピングされます.この注釈は、@XmlElementWrapper(name="items")@XmlElement(name="item")public List itemsなどの要素をパッケージ化できます.このようなXMLスタイルが生成されます:       ...        ... @XmlJavaTypeAdapter  フィールドまたは属性をXMLにマッピングするアダプタをカスタマイズします.たとえば、クラスにインタフェースが含まれている場合、javax.xml.bind.annotation.adapters.XmlAdapterクラスから継承されたアダプタを定義し、このインタフェースがXMLにどのようにマッピングされるかを指定できます.@XmlSchemaはパッケージ全体のnamespaceを構成します.この注釈はpackage-info.javaファイルに...という形式で配置する必要があります.この注釈は、@XmlElementWrapper(name="items")@XmlElement(name="item")public List itemsなどの要素をパッケージ化することができます.このようなXMLスタイルが生成されます:    ...     ...

3.くだらないことは言わないで、私たちは直接とても簡単な例のプログラムに行きます.
3.1 2つの基本的なPOJOクラス.
package com.npf.jaxb;

public class Classroom {
	
	private int id;
	
	private String name;
}
package com.npf.jaxb;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Student {

	private int id;
	
	private String name;
	
	private int age;
	
	private Classroom room;
}
 3.2测试方法 
  
  
 
package com.npf.jaxb;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.junit.Test;

public class JAXBTest {
	
	@Test
	public void object2xml() throws JAXBException{
		JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
		Marshaller marshaller = jaxbContext.createMarshaller();
		marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
		Student student = new Student(1, "zhangsan",1,new Classroom(1,"computer"));
		marshaller.marshal(student, System.out);
	}
	
	@Test
	public void xml2object() throws JAXBException{
		JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
		String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
				+ "<student><age>1</age><id>1</id><name>zhangsan</name><room><id>1</id>"
				+ "<name>computer</name></room></student>";
		Student student = (Student) unmarshaller.unmarshal(new StringReader(xml));
		System.out.println(student.getName()+","+student.getRoom().getName());
	}
}