java 사용 jaxb 조작 xml 예시
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.