XML, JSON Parsing, OPEN API

서현서현·2022년 5월 2일
0

서블릿 & JSP

목록 보기
10/26

JAVA를 통해 XML 핸들링

XML 문서생성 예제

  • XML DOM을 이용한 XML문서 생성 예제
  • W3C(WorldWide Web Consortium) DOM(Document Object Model) 표준에 대하여
    • DOM은 문서에 접근하는 표준방법으로서, 이를 이용하면 플랫폼 및 개발언어에 독립적으로 문서의 내용, 구조 및 스타일 정보를 동적으로 처리(접근, 수정, 삭제) 할 수 있다.
    • W3C DOM 표준은 다음과같이 크게 3가지로 나누어 볼 수 있다
      • Core DOM - 모든 문서타입을 위한 핵심표준모델(API)
      • XML DOM - XML문서를 위한 표준모델
      • HTML DOM - HTML문서를 위한 표준모델
      • 예를들면, HTML DOM은 HTML엘리먼트 요소 및 속성정보를 핸들링하기 위한 인터페이스를 제공한다

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();
	}

}

OPENAPI

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();
	}

}

0개의 댓글