XML을 자바로 어떻게 파싱하고 ... 하는지 연습해보자
XML은 보통 설정파일로 많이 사용됨
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
// XML DOM을 이용한 XML문서 생성 예제
public class T01_DOMCreationTest {
/* W3C(WorldWide Web Consortium) DOM(Document Object Model) 표준에 대하여
DOM은 문서에 접근하는 표준방법으로서, 이를 이용하면 플랫폼 및 개발언어에 독립적으로 문서의 내용,
구조 및 스타일 정보를 동적으로 처리(접근, 수정, 삭제) 할 수 있다.
W3C DOM 표준은 다음과같이 크게 3가지로 나누어 볼 수 있다
Core DOM - 모든 문서타입을 위한 핵심표준모델(API)
XML DOM - XML문서를 위한 표준모델
HTML DOM - HTML문서를 위한 표준모델
예를들면, HTML DOM은 HTML엘리먼트 요소 및 속성정보를 핸들링하기 위한 인터페이스를 제공한다
*/
public void createDoc() throws ParserConfigurationException, TransformerException {
// XML 문서를 생성하기 위한 DocumentBuilder객체 생성하기
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
// Document 객체 생성
Document document = builder.newDocument();
// root 엘리먼트 생성
Element root = document.createElement("root");
// booklist 엘리먼트 생성
Element booklist = document.createElement("booklist");
// book 엘리먼트 생성 및 속성값 설정하기
Element book = document.createElement("book");
book.setAttribute("isbn", "B001");
book.setAttribute("kind", "JAVA");
// 자식 엘리먼트 생성 및 설정
Element title = document.createElement("title");
title.setTextContent("자바초급");
Element autor = document.createElement("author");
autor.setTextContent("이순신");
Element price = document.createElement("price");
price.setTextContent("25000");
// book엘리먼트에 자식 엘리먼트 추가하기
book.appendChild(title);
book.appendChild(autor);
book.appendChild(price);
// booklist 엘리먼트에 자식엘리먼트 추가하기
booklist.appendChild(book);
//----------------------------------------------------------------------------
// book 엘리먼트 생성 및 속성값 설정하기
book = document.createElement("book");
book.setAttribute("isbn", "B002");
book.setAttribute("kind", "JAVA");
// 자식 엘리먼트 생성 및 설정
title = document.createElement("title");
title.setTextContent("자바고급");
autor = document.createElement("author");
autor.setTextContent("홍길동");
price = document.createElement("price");
price.setTextContent("28000");
// book엘리먼트에 자식 엘리먼트 추가하기
book.appendChild(title);
book.appendChild(autor);
book.appendChild(price);
// booklist 엘리먼트에 자식엘리먼트 추가하기
booklist.appendChild(book);
//----------------------------------------------------------------------------
// book 엘리먼트 생성 및 속성값 설정하기
book = document.createElement("book");
book.setAttribute("isbn", "B003");
book.setAttribute("kind", "DB");
// 자식 엘리먼트 생성 및 설정
title = document.createElement("title");
title.setTextContent("DB설계");
autor = document.createElement("author");
autor.setTextContent("이몽룡");
price = document.createElement("price");
price.setTextContent("30000");
// book엘리먼트에 자식 엘리먼트 추가하기
book.appendChild(title);
book.appendChild(autor);
book.appendChild(price);
// booklist 엘리먼트에 자식엘리먼트 추가하기
booklist.appendChild(book);
//----------------------------------------------------------------------------
// book 엘리먼트 생성 및 속성값 설정하기
book = document.createElement("book");
book.setAttribute("isbn", "B004");
book.setAttribute("kind", "DB");
// 자식 엘리먼트 생성 및 설정
title = document.createElement("title");
title.setTextContent("디비구현");
autor = document.createElement("author");
autor.setTextContent("일지매");
price = document.createElement("price");
price.setTextContent("40000");
// book엘리먼트에 자식 엘리먼트 추가하기
book.appendChild(title);
book.appendChild(autor);
book.appendChild(price);
// booklist 엘리먼트에 자식엘리먼트 추가하기
booklist.appendChild(book);
//----------------------------------------------------------------------------
// 루트 엘리먼트에 booklist추가하기
root.appendChild(booklist);
// 도큐먼트에 root엘리먼트 추가하기
document.appendChild(root);
// XML 문자열로 만환하기
ByteArrayOutputStream out = new ByteArrayOutputStream();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(out);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 출력인코딩 설정
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 들여쓰기설정(공백크기 : 2)
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
// 변환작업 시작
transformer.transform(source, result);
//파일에 문서내용 저장하기
try(FileOutputStream fos = new FileOutputStream("./src/new_book.xml")) {
fos.write(out.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
new T01_DOMCreationTest().createDoc();
}
}
실행하면 다음 XML파일이 설정한 경로에 생성된다
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<booklist>
<book isbn="B001" kind="JAVA">
<title>자바초급</title>
<author>이순신</author>
<price>25000</price>
</book>
<book isbn="B002" kind="JAVA">
<title>자바고급</title>
<author>홍길동</author>
<price>28000</price>
</book>
<book isbn="B003" kind="DB">
<title>DB설계</title>
<author>이몽룡</author>
<price>30000</price>
</book>
<book isbn="B004" kind="DB">
<title>디비구현</title>
<author>일지매</author>
<price>40000</price>
</book>
</booklist>
</root>
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class T02_DOMParsingTest {
public void parse() throws Exception {
// DOM Document 객체 생성하기 위한 팩토리 생성
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
// XML 파일지정
String url = new File("./src/new_book.xml").toURI().toString();
System.out.println(url);
// DOM 파서로부터 입력받은 파일을 파싱하도록 요청
Document document = builder.parse(url); // 이렇게 해도되고
//Document document = builder.parse(new File("./src/new_book.xml")); // 이렇게 해도되고
// DOM Document 객체로부터 루트 엘리먼트 및 자식객체 가져오기
Element root = document.getDocumentElement();
System.out.println("루트 엘리먼트 태그명 : "+ root.getTagName());
// 하위 엘리먼트 접근방법1 : getElementByTagName() 이용하기
NodeList bookNodeList = root.getElementsByTagName("book");
Node firstBookNode = bookNodeList.item(0); //첫번째항목
Element firstBookElement = (Element) firstBookNode;
// 속성 접근방법1 : 엘리먼트 객체의 getAttribute() 사용
System.out.println("엘리먼트 객체의 getAttribute() 사용 => "
+ firstBookElement.getAttribute("isbn"));
// 속성 접근방법2 : 노드 객체의 getAttributes() 이용(속성노드 접근하기)
NamedNodeMap nodeMap = firstBookNode.getAttributes();
System.out.println("노드 객체의 getAttributes() 이용 => "
+ nodeMap.getNamedItem("isbn").getNodeValue());
// 하위 엘리먼트 접근방법 2 : getChildNodes() 이용
NodeList firstBookChildNodeList = firstBookNode.getChildNodes();
// 엔터키에 해당하는 부분이 읽힐 수도 있으므로, getChildNodes() 보다는
// getElementsByTagName()을 이용해 접근하는 방법을 추천한다
// #text노트(공백문자)때문에 인덱스값을 1로 설정해야한다
Node titleNode = firstBookChildNodeList.item(1);
Element titleElement = (Element) titleNode;
System.out.println("titleElement.getTagName() => "
+ titleElement.getTagName());
System.out.println("titleElement.getTextContent() => "
+ titleElement.getTextContent());
// 전체출력하기
System.out.println("----------------------------------------------");
System.out.printf("%8s %8s %15s %10s %8s\n",
"ISBN","분류","제목","저자","가격");
System.out.println("----------------------------------------------");
for(int i=0; i<bookNodeList.getLength(); i++) {
Node bookNode = bookNodeList.item(i);
Element element = (Element) bookNode;
String isbn = element.getAttribute("isbn");
String kind = element.getAttribute("kind");
String title = element.getElementsByTagName("title").item(0).getTextContent().trim();
String author = element.getElementsByTagName("author").item(0).getTextContent().trim();
String price = element.getElementsByTagName("price").item(0).getTextContent().trim();
String str = String.format("%8s %8s %15s %10s %8s", isbn,kind,title,author,price);
System.out.println(str);
}
}
public static void main(String[] args) throws Exception {
new T02_DOMParsingTest().parse();
}
}
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class T03_DOMParsingExam {
public void parse() throws ParserConfigurationException, Exception {
String svcKey = "Grid_20150827000000000227_1"; // 레시피 재료 정보 조회 서비스
String apiKey = "1df7e8571e8df3f8cbc9b87691ca7d3e4d04f03c593d477e52bf67b03f0b6e1c"; // 개인별 발급.
String startIdx = "1"; // 레시피 재료 시작 순번
String endIdx = "5"; // 레시피 재료 종료 순번
String recipeId = "474"; // 래시피가 궁금한 음식 ID
URL url = new URL("http://211.237.50.150:7080/openapi/"+ apiKey
+ "/xml/"+ svcKey + "/"+startIdx +"/" + endIdx
+"?RECIPE_ID=" + recipeId);
//System.out.println(url);
// DOM Document 객체 생성하기 위한 팩토리 생성
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document document = builder.parse(url.toString());
// 루트엘리먼트 가져오기
Element root = document.getDocumentElement();
System.out.println("루트 엘리먼트 태그명 : "+root.getTagName());
// 전체 레시피 수를 가져오기
String totalCnt = root.getElementsByTagName("totalCnt").item(0).getTextContent();
// 마지막 인덱스를 전체 레시피수로 설정
endIdx = totalCnt;
url = new URL("http://211.237.50.150:7080/openapi/"+ apiKey
+ "/xml/"+ svcKey + "/"+startIdx +"/" + endIdx
+"?RECIPE_ID=" + recipeId);
document = builder.parse(url.toString());
root = document.getDocumentElement();
String code = root.getElementsByTagName("code").item(0).getTextContent();
if(code.contentEquals("INFO-000")) {
NodeList rowNodeList = root.getElementsByTagName("row");
for(int i=0; i<rowNodeList.getLength(); i++) {
Element element = (Element) rowNodeList.item(i);
String rowNum = element.getElementsByTagName("ROW_NUM").item(0).getTextContent();
String irdntNm = element.getElementsByTagName("IRDNT_NM").item(0).getTextContent();
String cpcty = element.getElementsByTagName("IRDNT_CPCTY").item(0).getTextContent();
String typeName = element.getElementsByTagName("IRDNT_TY_NM").item(0).getTextContent();
String str = String.format("%3s %8s %10s %10s %8s",rowNum,recipeId,cpcty,irdntNm,typeName);
System.out.println(str);
System.out.println("-------------------------------------------------------------------");
}
}
}
public static void main(String[] args) throws Exception {
new T03_DOMParsingExam().parse();
}
}