java 사용 jaxb 조작 xml 예시

8319 단어 javajaxbxml
먼저 다음 예제 프레젠테이션에 사용할 두 개의 예제 클래스 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 서열화된 클래스에 @XmlRoot Element 주석을 붙여야 합니다. 그렇지 않으면 오류가 발생합니다. (오류 알림이 명확합니다. 여기에 붙이지 않습니다.)
2JAXB가 XML을 정렬할 때 기본 정렬화 getter와 setter, 그리고 getter와 setter가 쌍으로 나타나야 정렬화
3 속성 이름, 기본 서열화된 클래스와 속성 이름은 기본적으로 알파벳에서 소문자로 변환됩니다. 속성 이름을 제어하려면 getter나 setter에서 @XmlElement(name='ClassAId')를 사용하여 이름을 지정해야 합니다. 여기서 주의해야 할 것은 @XmlElement를 getter나 setter에 놓아도 되지만, getter와 setter에서 @XmlElement 주석을 동시에 사용할 수 없다는 것입니다.
4 루트 노드의 이름을 어떻게 제어합니까?
@XmlRootElement를 사용하여 name 속성을 지정하면 됩니다. 예를 들어 @XmlRootElement(name="ClassA")
5 네임스페이스 추가 방법
@XmlRootElement(namespace = "cn.lzrabbit")를 사용하여namespace 속성을 지정합니다
6 각 속성의 이름을 어떻게 정확하게 제어합니까
JAXB가 자동으로 이니셜 소문자로 바뀌면 예측할 수 없는 속성 이름이 나타날 수 있습니다. 귀찮지 않으면 모든 속성에 @XmlElement(name=")를 설정하고 편하려면 Field를 사용하십시오.
7 어떻게 서열화할 때 setter와 getter 대신 Field 필드를 사용합니까
사용할 클래스에 @XmlAccessorType(XmlAccessType.FIELD) 메모를 추가하고 XmlAccessType으로 지정합니다.FIELD, 여기서 @XmlAccessorType(XmlAccessType.FIELD) 메모를 사용하는 것을 강력히 추천합니다. 그러면 각 요소의 이름을 정확하게 제어할 수 있고, 각 속성에 @XmlElement(name="") 메모를 설정할 필요가 없습니다. 물론 Field에서 @ 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>
PS: 여기에 xml 작업에 대한 온라인 도구를 몇 가지 더 제공하여 참고하여 사용할 수 있습니다.
온라인 XML/JSON 상호 변환 도구:
http://tools.jb51.net/code/xmljson
온라인 포맷 XML/온라인 압축 XML:
http://tools.jb51.net/code/xmlformat
XML 온라인 압축/포맷 도구:
http://tools.jb51.net/code/xml_format_compress

좋은 웹페이지 즐겨찾기