5 분 이내에 Java에서 XML로, XML에서 Java로 코딩을 시작하려면 단순 XML 직렬화를 시도하십시오. JAXB API를 배우는 데 시간을 소비하지 마십시오
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
그러나 JAXB를 배우는 데 관심이 있다면 훌륭한 자습서가 있습니다.
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
튜토리얼의 내용 :
간단한 Java-XML 직렬화를위한 JAXB
Java에서 XML 직렬화를 수행하는 여러 가지 방법이 있습니다. 구문 분석 및 직렬화를 세밀하게 제어하려면 SAX, DOM 또는 Stax를 사용하여 성능을 향상시킬 수 있습니다. 그러나 내가 자주하고 싶은 일은 POJO와 XML 간의 간단한 매핑입니다. 그러나 수동으로 XML 이벤트 구문 분석을 수행하기 위해 Java 클래스를 작성하는 것은 쉽지 않습니다. 최근에 JAXB가 빠르고 편리한 Java-XML 매핑 또는 직렬화라는 것을 알았습니다.
JAXB에는 유용한 기능이 많이 있으며 여기에서 참조 구현을 확인할 수 있습니다. Kohsuke의 블로그 는 JAXB에 대해 더 자세히 배울 수있는 좋은 자료입니다. 이 블로그 항목에서는 JAXB를 사용하여 간단한 Java-XML 직렬화를 수행하는 방법을 보여줍니다.
POJO에서 XML로
Item Java 객체가 있다고 가정 해 봅시다. Item 객체를 XML 형식으로 직렬화하고 싶습니다. 먼저해야 할 일은 javax.xml.bind.annotation. * 패키지의 XML 주석으로이 POJO에 주석을 달아야합니다. Item.java에 대한 코드 목록 1을 참조하십시오.
코드에서
@XmlRootElement(name="Item")
내가 루트 요소가되고 싶다는 것을 나타냅니다.
@XmlType(propOrder = {"name", "price"})
요소를 XML 출력으로 정렬하려는 순서를 나타냅니다.
@XmlAttribute(name="id", ...)
id가 루트 요소의 속성임을 나타냅니다.
@XmlElement(....)
가격과 이름이 Item의 요소가 되길 원한다는 것을 나타냅니다.
내 Item.java
준비가되었습니다. 그런 다음 Item 마샬링을위한 JAXB 스크립트를 작성할 수 있습니다.
//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));
전체 코드 목록은 코드 목록 2를 참조하십시오 main.java
. 출력 코드 목록 3 item.xml
파일이 작성됩니다. 다음과 같이 보입니다 :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
쉬운가요? 또는 단순히 marshal (...) 메소드의 매개 변수를 변경하여 출력 XML을 텍스트 문자열, 스트림, 작성기, ContentHandler 등으로 채널링 할 수 있습니다.
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);
XML에서 POJO로
과정을 반대로하자. 이제 XML 문자열 데이터 조각이 있고이를 Item.java 객체로 변환하려고한다고 가정합니다. XML 데이터 (코드 목록 3)는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>
그런 다음이 XML 코드를 Item 객체에 정렬 해제 할 수 있습니다
...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...
전체 코드 목록은 코드 목록 2 (main.java)를 참조하십시오. XML 소스는 스트림과 파일 모두에서 여러 형태로 제공 될 수 있습니다. 유일한 차이점은 메소드 매개 변수입니다.
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
XML 스키마를 사용한 유효성 검사
마지막으로 언급하고자하는 것은 Java 객체를 비 정렬 화하기 전에 스키마로 입력 XML의 유효성을 검사하는 것입니다. item.xsd라는 XML 스키마 파일을 만듭니다. 전체 코드 목록은 코드 목록 4 (Item.xsd)를 참조하십시오. 이제 내가해야 할 일은 유효성 검사를 위해이 스키마를 등록하는 것입니다.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
XML 데이터를 POJO로 비 정렬 화하려고 할 때 입력 XML이 스키마를 준수하지 않으면 예외가 발생합니다. 전체 코드 목록은 코드 목록 5 (invalid_item.xml)를 참조하십시오.
javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
not a valid value for 'integer'.]
여기서는 'id'속성을 정수 대신 문자열로 변경합니다.
XML 입력이 스키마에 대해 유효한 경우 XML 데이터는 Item.java 오브젝트에 성공적으로 비 정렬 화됩니다.