Java - 17. XML

갓김치·2020년 10월 20일
0

고급자바

목록 보기
40/47
post-custom-banner

XML

  • eXentsible Markup Language

DOM

  • Document Object Model (DOM)
  • a platform and language-neutral interface
    • that allows programs and scripts to dynamically access and update the content, structure, and style of a document."
  • 부모 interface: node
    • 자식 interface: attr, element, comment 모두 node~
  • 자바에서 모든 객체가 모두 Object = XML에서 모든 객체는 Node
  • w3school XML
  • java 공식 api

Parsing 방법

  • SaX Parsing: 옛날 방법
  • DOM Parsing
    • 프로그램 시작 동시에 DOM객체가 메모리에 올라감
      • 장점: 빠른 속도
      • 단점: 메모리 많이 잡아먹음 -> 옛날엔 그래서 SaX방식 썼음

예제: DomParsingTest.java

public class DomParsingTest2 {

	public void parsing() {
		try {

			// 1. DOM Document 객체 생성
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dbf.newDocumentBuilder();

			// 2. XML파일 지정 (파일 객체로 읽을 수도 있음
			String url = getClass()
						.getResource("/kr/or/ddit/basic/book.xml") /*url 객체 리턴*/
						.toExternalForm(); // toString()도 가능

			Document xmlDoc = builder.parse(url); // 파싱된 결과를 document object로 리턴

			// 3. DOM document 객체로부터 루트 엘리먼트 및 자식 객체 가져오기
			Element root = xmlDoc.getDocumentElement();
			System.out.println("루트 엘리먼트 태그명: " + root.getTagName());

			// 4.
			// 하위 엘리먼트 접근방법 1 : getElementsByTagName() 이용
			// getElementsByTagName은 Element Interface가 제공
			NodeList bookNodeList = root.getElementsByTagName("book");

			Node firstBookNode = bookNodeList.item(0); // 첫번째 -> 자바초급

			Element firstBookElement = (Element) firstBookNode; //Node가 최상위니까 다운캐스팅

			// 속성 접근 방법 1 : 앨리먼트 객체의 getAttribute()이용
			System.out.println("엘리먼트 객체의 getAttribute() 이용 => " +
								firstBookElement.getAttribute("isbn"));

			// 속성 접근 방법 2 : 노드객체의 getAttributes() 이용 -- 일반적이진 않음
			NamedNodeMap nodeMap = firstBookNode.getAttributes();
			System.out.println("노드 객체의 getAttributes() 이용 => " +
								nodeMap.getNamedItem("isbn"));

			// 하위 엘리먼트 접근방법 2 : getChildNodes()메서드 이용
			NodeList firstBookChildNodeList = firstBookNode.getChildNodes();
			// 엔터키에 해당하는 부분이 읽힐 수 있으므로 getChildNodes()보다는 getElementsByTagName()추천
			Node titleNode = firstBookChildNodeList.item(1); // item(0): <booklist>태그 다음 enter가 읽힘
			Element titleElement = (Element) titleNode;
			System.out.println("titleElement.getTagName() => " + titleElement.getTagName());
			System.out.println("titleElement.getTextContext() => " + titleElement.getTextContent());

			/*
			 * 전체 출력하기
			 * 속성값 : isbn, kind
			 * 엘리먼트 텍스트값: title, author, price
			 */

			System.out.println("-------------------------------------------------------------");
			for (int i = 0; i < bookNodeList.getLength(); i++) {
				// 책 순서대로 꺼내고 Element로 다운캐스팅
				Node bookNode = bookNodeList.item(i);
				Element bookElement = (Element) bookNode;

				// 속성값 isbn, kind출력
				String isbn = bookElement.getAttribute("isbn");
				String kind = bookElement.getAttribute("kind");

				// 엘리먼트 텍스트값 title, author, price
				String title = bookElement.getElementsByTagName("title").item(0).getTextContent();
				String author = bookElement.getElementsByTagName("author").item(0).getTextContent();
				String price = bookElement.getElementsByTagName("price").item(0).getTextContent();
				String str = String.format("%8s %10s %20s %10s %8s", isbn, kind, title, author, price);
				System.out.println(str);
			}
			System.out.println("-------------------------------------------------------------");


		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new DomParsingTest2().parsing();
	}
}
profile
갈 길이 멀다
post-custom-banner

0개의 댓글