먼저 후속 샘플 데모를 위해 두 개의 샘플 클래스인 ClassA와 ClassB를 정의합니다.
package cn.lzrabbit; public class ClassA { private int classAId; private String classAName; private ClassB classB; public int getClassAId() { return classAId; } public void setClassAId(int classAId) { this.classAId = classAId; } public String getClassAName() { return classAName; } public void setClassAName(String classAName) { this.classAName = classAName; } public ClassB getClassB() { return classB; } public void setClassB(ClassB classB) { this.classB = classB; } } ClassA
package cn.lzrabbit; public class ClassB { private int classBId; private String classBName; public int getClassBId() { return classBId; } public void setClassBId(int classBId) { this.classBId = classBId; } public String getClassBName() { return classBName; } public void setClassBName(String classBName) { this.classBName = classBName; } } ClassB
직렬화를 위한 XmlUtil
package cn.lzrabbit; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.*; public class XmlUtil { public static String toXML(Object obj) { try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xm头声明信息 StringWriter writer = new StringWriter(); marshaller.marshal(obj, writer); return writer.toString(); } catch (Exception e) { throw new RuntimeException(e); } } @SuppressWarnings("unchecked") public static <T> T fromXML(String xml, Class<T> valueType) { try { JAXBContext context = JAXBContext.newInstance(valueType); Unmarshaller unmarshaller = context.createUnmarshaller(); return (T) unmarshaller.unmarshal(new StringReader(xml)); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } } XmlUtil
은 다음과 같이 호출됩니다.
package cn.lzrabbit; public class MainRun { /** * @param args */ public static void main(String[] args) { ClassB classB = new ClassB(); classB.setClassBId(22); classB.setClassBName("B2"); ClassA classA = new ClassA(); classA.setClassAId(11); classA.setClassAName("A1"); classA.setClassB(classB); System.out.println(XmlUtil.toXML(classA)); } } MainRun
출력 결과는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <classA> <classAId>11</classAId> <classAName>A1</classAName> <classB> <classBId>22</classBId> <classBName>B2</classBName> </classB> </classA>
다음 사항에 유의해야 합니다
1 직렬화할 클래스에 @XmlRootElement 주석을 추가합니다. 그렇지 않으면 오류가 발생합니다. (오류 프롬프트가 매우 명확하므로 여기에 게시하지 않겠습니다.)
2 JAXB가 XML을 직렬화할 때 getter와 setter는 기본적으로 직렬화되며 getter와 setter는 쌍으로 나타나야 합니다. 직렬화된
3개 속성 이름, 기본적으로 직렬화된 클래스 및 속성 이름의 첫 글자는 소문자로 변환됩니다. 속성 이름을 제어해야 하는 경우 @XmlElement(name="ClassAId")를 사용해야 합니다. 여기서 주목해야 할 것은 @XmlElement입니다. getter 또는 setter에 배치할 수 있지만 하나만 배치할 수 있으므로 @XmlElement 주석을 getter와 setter 모두에 사용할 수는 없습니다. setter at same time
4 루트 노드 이름을 제어하는 방법은 무엇입니까?
@XmlRootElement를 사용하여 @XmlRootElement(name="ClassA")와 같은 이름 특성을 지정합니다.
5 네임스페이스를 추가하는 방법
@XmlRootElement(namespace="cn.lzrabbit") 사용 네임스페이스 속성 지정
6 각 속성 이름을 정확하게 제어하는 방법
JAXB는 자동으로 첫 글자를 소문자로 변환하므로 예측할 수 없는 속성 이름이 표시됩니다. 번거롭지 않다면 @XmlElement( name="") 각 속성에 대해 문제를 해결하려면 Field
7 직렬화 시 setter 및 getter를 사용하는 대신 Field 필드를 사용하는 방법
@XmlAccessorType(XmlAccessType.FIELD) 추가 XmlAccessType.FIELD의 경우 @XmlAccessorType(XmlAccessType.FIELD) 주석을 사용하는 것이 좋습니다. 이렇게 하면 @XmlElement를 설정하지 않고도 각 요소의 이름을 정확하게 제어할 수 있기 때문입니다. (name="") 각 속성에 대한 주석은 물론 필드에 @XmlElement 주석을 사용할 수도 있습니다.
다음은 위 주석을 사용한 코드 예입니다
@XmlRootElement(namespace="cn.lzrabbit") @XmlAccessorType(XmlAccessType.FIELD) public class ClassA { private int classAId; @XmlElement(name="ClassAName") private String classAName; private ClassB classB; public int getClassAId() { return classAId; } public void setClassAId(int classAId) { this.classAId = classAId; } public String getClassAName() { return classAName; } public void setClassAName(String classAName) { this.classAName = classAName; } public ClassB getClassB() { return classB; } public void setClassB(ClassB classB) { this.classB = classB; } } @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class ClassB { private int ClassBId; private String ClassBName; public int getClassBId() { return ClassBId; } public void setClassBId(int classBId) { this.ClassBId = classBId; } public String getClassBName() { return ClassBName; } public void setClassBName(String classBName) { this.ClassBName = classBName; } }
출력 xml은
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:classA xmlns:ns2="cn.lzrabbit"> <classAId>11</classAId> <ClassAName>A1</ClassAName> <classB> <ClassBId>22</ClassBId> <ClassBName>B2</ClassBName> </classB> </ns2:classA>
More입니다. jaxb를 사용하여 xml 예제를 작동하는 여러 Java 관련 기사는 PHP 중국어 웹사이트에 주목하세요!