Java
Java XML TransformerFactory
승모근뭉치
2023. 1. 10. 01:00
프로젝트 내 src 내 xml 패키지 내 test02.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 도서리스트 (책)* >
<!ELEMENT 책 (제목, 저자, 출판사, 가격, 이미지?, 소개?)> <!-- ?는 zero 나 one -->
<!ELEMENT 제목 (#PCDATA)>
<!ELEMENT 저자 (#PCDATA)>
<!ELEMENT 출판사 (#PCDATA)>
<!ELEMENT 가격 (#PCDATA)>
<!ELEMENT 이미지 EMPTY>
<!ELEMENT 소개 (#PCDATA)>
<!-- 속성 선언 -->
<!--
<!ATTLIST 책
id ID #IMPLIED
분류 CDATA #REQUIRED>
-->
<!-- 맨 마지막 XPath 검색예제용 -->
<!ATTLIST 책
분류 CDATA #REQUIRED
id CDATA #REQUIRED>
<!-- 요것은 생략이 가능하도록 IMPLIED로
경로를 나타내도록 src 추가 -->
<!ATTLIST 이미지
name ENTITY #IMPLIED
src CDATA #IMPLIED>
<!-- 이미지 이용하기때문에 노테이션 선언
헬퍼 프로그램은 익스플로러로 -->
<!NOTATION gif
PUBLIC "image/gif" "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe">
<!NOTATION jpg
PUBLIC "image/jpg" "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe">
<!-- 외부 언파스드 엔티티 선언 -->
<!-- 외부 언파스드 엔티티(이미지) 선언 NDATA는 노테이션의 데이타라는 말 -->
<!ENTITY b1_img SYSTEM "img1.gif" NDATA gif>
<!ENTITY b2_img SYSTEM "img2.jpg" NDATA jpg>
<!ENTITY b3_img SYSTEM "img3.jpg" NDATA jpg>
<!-- 외부 파스드 엔티티 선언 -->
<!-- XML 파서가 해석할 수 있는 그러한 데이타 텍스트 파일, 이미지는 해석 못한다
파스드 엔티티는 노테이션 선언과 다르게 따로 NDATA 같이 적어줄 필요가 없구 -->
<!ENTITY b1_intro SYSTEM "b1.txt">
<!ENTITY b2_intro SYSTEM "b2.txt">
<!ENTITY b3_intro SYSTEM "b3.txt">
프로젝트 내 src 내 xml 패키지 내 test02.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--test02.dtd 파일 쓴 후 -->
<!DOCTYPE 도서리스트 SYSTEM "test02.dtd"><!-- id="book1"는 필요가 없다 -->
<도서리스트>
<!-- 마지막 XPath 검색예제 이전것 -->
<!--<책 분류="컴퓨터">-->
<책 분류="컴퓨터" id="book1"><!-- id추가후 XPathTest.java로 가기 -->
<제목>JAVA 프로그래밍</제목>
<저자>김말똥</저자>
<출판사>아이티 출판</출판사>
<가격>20000</가격>
<이미지 name="b1_img" /><!-- test02.dtd에 데이타가 EMPTY로 선언되었으므로 암것도 안씀 -->
<소개>&b1_intro;</소개>
</책>
<!--<책 분류="소설">-->
<책 분류="소설" id="book2">
<제목>삼국지</제목>
<저자>이문열</저자>
<출판사>역사 출판</출판사>
<가격>15000</가격>
<이미지 name="b2_img"/>
<소개>&b2_intro;</소개>
</책>
<!--<책 분류="컴퓨터">-->
<책 분류="컴퓨터" id="book3">
<제목>C언어</제목>
<저자>강길동</저자>
<출판사>터보 출판사</출판사>
<가격>15000</가격>
<이미지 name="b3_img"/>
<소개>&b3_intro;</소개>
</책>
</도서리스트>
프로젝트 내 src 내 java_xml 패키지 내 SaveDOMFile.java
package java_xml;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
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;
//변환기 이용해서 파일로 저장
public class SaveDOMFile {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//DOM 파서 생성
DocumentBuilderFactory docFac = DocumentBuilderFactory.newInstance();
docFac.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = docFac.newDocumentBuilder();
//XML 문서 파싱
Document doc = builder.parse("src/xml/test02.xml"); // 파싱한 결과 다큐먼트객체를 불러온다
//루트 엘리먼트 얻기
Element rootElement = doc.getDocumentElement();
// 변환기능이 있든 없든 변환기를 쓸 수 있다 변환기 생성
TransformerFactory factory = TransformerFactory.newInstance();
//XSL 문서이자 언어(XPath언어와 XSLT로 구성된 언어)의 정보를 Source 객체로 생성
//XSL변환기 생성:변환기능이 없고, 파일로 저장 또는 네트웍으로 전송 기능만 갖춘
Transformer transformer = factory.newTransformer(); //참조 인스턴스
// 입력소스 객체로 DOM 객체 생성
//Source 객체 타입, Source인터페이스를 구현한 DOMSource
Source src = new DOMSource(doc);
//출력하기 위해서 스트림객체를 생성, 변환후의 객체로 스트림 객체 생성
//Result인터페이스를 구현한 StreamResult클래스
Result res = new StreamResult(new File("src/xml/test02_1.xml"));
//마지막으로 변환과정이 필요
transformer.transform(src, res);
// transformer.transform(소스객체Source xmlSource, 변환된후의결과Result객체 Result outputTarget);
// DOMSource,SAXSource,StreamSource세가지형태의소스를이용해세가지결과객체를만들수있다
// 결과는 DOMResult,SAXResult,StreamResult를 만들 수 있다.
/*
* Source와 Result라는 인터페이스를 구현한 클래스
* 가 바로
* DOMSource - 소스 XML문서가 DOM객체 형태로 입력할 때 사용하는 클래스
* DOMResult - 변환 후의 결과가 DOM 객체로 만들 경우 사용하는 클래스
*
* SAXSource - 소스 XML문서가 이벤트 형태로 입력될 때 사용하는 클래스
* SAXResult - 변환 후의 결과가 이벤트 형태로 만들 경우 사용하는 클래스
*
* StreamSource - 소스 XML문서가 파일 또는 네트웍 형태로 입력될 때 사용하는 클래스
* StreamResult - 변환 후의 결과가 파일 저장 또는 네트웍으로 전송하고자 할때 사용하는 클래스
*/
//문서파싱하기 위해서는 돔파서를 생성해야
System.out.println("파일로 저장되었습니다...");
}
}
SaveDOMFile.java 를 실행하면 콘솔에 파일로 저장되었습니다... 라고 뜨고
프로젝트 내 src 내 xml 패키지 내 test02_1.xml 파일이 생성된다.
실행결과 생성되는 파일: 프로젝트 내 src 내 xml 패키지 내 test02_1.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--test02.dtd 파일 쓴 후 --><!-- id="book1"는 필요가 없다 --><도서리스트><책 분류="컴퓨터"><제목>JAVA 프로그래밍</제목><저자>김말똥</저자><출판사>아이티 출판</출판사><가격>20000</가격><이미지 name="b1_img"/><!-- test02.dtd에 데이타가 EMPTY로 선언되었으므로 암것도 안씀 --><소개>한국 엘리트 지식인 집단은 어떻게 탄생하는가 이 책은 미국 유학파 엘리트들이 학계와 기업에서 어떻게 헤게모니를 장
악하고, 그 기득권을 유지하는지를 탐색한다. 미국 유학파 엘리트가 한국과 미국 사이에 어떤 상황과 위치에 놓여 있는지를
분석하고, 그들의 독특한 정체성을 규명한다. 이를 통해 학벌사회의 최상위에 있는 한국 엘리트 지식인 집단이 어떻게 탄..</소개></책><책 분류="소설"><제목>삼국지</제목><저자>이문열</저자><출판사>역사 출판</출판사><가격>15000</가격><이미지 name="b2_img"/><소개>딱 1그램의 용기면 충분해!긴급구호 현장에서, 오지여행길에서, 강의실과 도서관에서, 백두대간 길에서 평생 가슴 뛰는
삶, 쓸모 있는 삶이란 어떠한가를 온몸으로 증명해온 한비야. 누구보다 치열하게, 열정적으로 살아온 그녀는 지금, 인생 후반
전을 준비하기 위해 잠시 숨을 고르고 있다. 두려움, 외로움, 불안과는 거리가 멀어 보이는 한비야에게도 두려움이라는 ..</소개></책><책 분류="컴퓨터"><제목>C언어</제목><저자>강길동</저자><출판사>터보 출판사</출판사><가격>15000</가격><이미지 name="b3_img"/><소개>세계가 주목하는 차이나 파워의 실체를 파헤치다!『슈퍼차이나』는 KBS 특별기획 다큐멘터리 《슈퍼 차이나》를 단행
본으로 엮은 책으로, 슈퍼파워로 떠오른 중국의 부상을 인구, 기업, 경제, 군사, 땅, 문화, 공산당이라는 다양한 프레임을 통해
속속들이 보여준다. 이 책은 전 세계에 막대한 영향을 미치고 있는 중국의 현재 모습과 그 속에 숨은 야심과 전략을 적나..</소개></책></도서리스트>
생성된 파일 test02_1.xml 을 보면 test02.xml 에서
<소개>&b1_intro;</소개>
<소개>&b2_intro;</소개>
<소개>&b3_intro;</소개>
태그안의 내용들이 파일로 저장이 될 때는 각각
SYSTEM 의 b1.txt, b2.txt, b3.txt 의 내용들로 채워졌음을 알 수 있다.