>  기사  >  백엔드 개발  >  Java는 jaxb를 사용하여 xml 예제를 작동합니다.

Java는 jaxb를 사용하여 xml 예제를 작동합니다.

高洛峰
高洛峰원래의
2017-01-11 13:06:251901검색

먼저 후속 샘플 데모를 위해 두 개의 샘플 클래스인 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 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.