[Java] DOM파서를 이용한 XML 파일 생성하기

Java에는 다양한 XML 파서를 이용할 수 있습니다. 그중에 DOM이 가장 직관적이고 쉬운 방법으로 XML을 처리할 수 있지 않을까 생각됩니다. DOM을 이용하여 XML을 생성하기 위해서는 기본적으로 모든 XML의 내용을 정의할 수 있는 Document를 생성해야 하는데요 이것을 생성하기 위해 DocumentBuilder 클래스를 사용합니다.

마지막으로 만들어진 XML 엘리먼트 노드들이 연결된 Document를 가지고 XML 파일을 생성하는데 이때에 Transformer 클래스를 사용합니다.

DOM Parser 결과물

이 예제를 수행하게 되면 다음의 같은 내용을 가진 file.xml 파일이 생성됩니다.
[code]<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no” ?>
<company>
<staff id=”1″>
<firstname>Gildong</firstname>
<lastname>Hong</lastname>
<nickname>Mr.Hong</nickname>
<salary>100000</salary>
</staff>
</company>[/code]

Java 클래스 소스

[code]try
{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

// 루트 엘리먼트
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement(“company”);
doc.appendChild(rootElement);

// staff 엘리먼트
Element staff = doc.createElement(“Staff”);
rootElement.appendChild(staff);

// 속성값 정의
Attr attr = doc.createAttribute(“id”);
attr.setValue(“1”);
staff.setAttributeNode(attr);

// 속성값을 정의하는 더 쉬운 방법
// staff.setAttribute(“id”, “1”);

// firstname 엘리먼트
Element firstname = doc.createElement(“firstname”);
firstname.appendChild(doc.createTextNode(“Gildong”));
staff.appendChild(firstname);

// lastname 엘리먼트
Element lastname = doc.createElement(“lastname”);
lastname.appendChild(doc.createTextNode(“Hong”));
staff.appendChild(lastname);

// nickname 엘리먼트
Element nickname = doc.createElement(“nickname”);
nickname.appendChild(doc.createTextNode(“Mr.Hong”));
staff.appendChild(nickname);

// salary 엘리먼트
Element salary = doc.createElement(“salary”);
salary.appendChild(doc.createTextNode(“100000”));
staff.appendChild(salary);

// XML 파일로 쓰기
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();

transformer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”);
transformer.setOutputProperty(OutputKeys.INDENT, “yes”); DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new FileOutputStream(new File(“C:\\file.xml”)));

// 파일로 쓰지 않고 콘솔에 찍어보고 싶을 경우 다음을 사용 (디버깅용)
// StreamResult result = new StreamResult(System.out);

transformer.transform(source, result);

System.out.println(“File saved!”);
}
catch (ParserConfigurationException pce)
{
pce.printStackTrace();
}
catch (TransformerException tfe)
{
tfe.printStackTrace();
}[/code]