관리 메뉴

nkdk의 세상

trans돔과 sax를 하며 xml 을 마칩니다. 본문

My Programing/XML

trans돔과 sax를 하며 xml 을 마칩니다.

nkdk 2008. 3. 8. 02:07
trans돔과 sax를 하며 xml 을 마칩니다.

import java.io.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;
import org.apache.crimson.tree.*;

public class TransDom {
static StringBuffer sb = new StringBuffer(); // 스트링 객체 생성
public static void main(String[] args) throws Exception{
if(args.length != 2) {
System.out.println("파일명 오류");
System.exit(-1);
}
String arg0 = args[0];

// DOM 준비
DocumentBuilderFactory docF = DocumentBuilderFactory.newInstance(); // 객체 생성됨
DocumentBuilder docB = docF.newDocumentBuilder();
Document doc = docB.parse(new FileInputStream(arg0));
Element root = doc.getDocumentElement();
// XML선언
sb.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>");
sb.append("<학생정보>");
trans(root);
sb.append("</학생정보>");
// 문자열 써넣기
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(args[1])));
pw.println(sb);
pw.close();
}

public static void trans(Node n) {
for(Node ch = n.getFirstChild();ch != null;ch.getNextSibling()){
if(ch.getNodeType() == Node.ELEMENT_NODE) {
if(ch.getNodeName().equals("student")) {
sb.append("학생");
trans(ch);
sb.append("</학생>");

} else if(ch.getNodeName().equals("name")) {
sb.append("이름");
trans(ch);
sb.append("</이름>");
} else if(ch.getNodeName().equals("age")) {
sb.append("나이");
trans(ch);
sb.append("</나이>");
}
} else if (ch.getNodeType() == Node.TEXT_NODE && ch.getNodeValue().trim().length() !=0) {
sb.append(ch.getNodeValue());
}
}
}
}

<?xml version="1.0" encoding="EUC-KR"?>
<student>
서울시 중구 서소문동

123-1234
<name>박치기</name>
</student>

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class SaxAttr {
public static void main(String[] args) throws Exception{
if(args.length != 1) {
System.out.println("실행 실패:파일명 부여");
System.exit(1);
}
// sax를 준비
SAXParserFactory spf = SAXParserFactory.newInstance();
// sax파서 객체 생성
SAXParser sp = spf.newSAXParser();
// 이벤트 핸들러 클래스 생성
AttrHandler ah = new AttrHandler();

sp.parse(new File(args[0]), ah);
}
}

class AttrHandler extends DefaultHandler {
// sax는 이벤트 단위로 실행할 때 사용하는 것이다.
public void startDocument() throws SAXException{ // 시작 도큐먼트
System.out.println("학생정보-------------------");
}
public void endDocument() throws SAXException{ // 끝 도큐먼트 상속

}

//startElement를 이용하여 XML문서 속성 정보 접근
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{
if(qName.equals("address")) {
String ty = attributes.getValue("type");
System.out.print(ty+" 주소:");
}else if(qName.equals("phone")) {
String ty = attributes.getValue("type");
System.out.print(ty+" 집전화:");
}else if(qName.equals("name")) {
System.out.print("이름:");
}
}
// 각 요소의 자료 출력
public void characters(char ch[], int start, int length) {
System.out.println(new String(ch, start, length));
}
}

import java.io.*;
import javax.xml.parsers.*;

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class SaxSelect {


public static void main(String[] args) throws Exception{
if(args.length != 1) {
System.out.println("실행 실패:파일명 부여");
System.exit(1);
}
// sax를 준비
SAXParserFactory spf = SAXParserFactory.newInstance();
// sax파서 객체 생성
SAXParser sp = spf.newSAXParser();
// 이벤트 핸들러 클래스 생성
SelectHandler sh = new SelectHandler();

sp.parse(new File(args[0]), sh);

}

}
class SelectHandler extends DefaultHandler {
StringBuffer sb = new StringBuffer();
boolean isPrint=false;
public void startDocument() throws SAXException{ // 시작 도큐먼트
sb.append("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n");
sb.append("<student>\n\t");

}
public void endDocument() throws SAXException{ // 끝 도큐먼트 상속
sb.append("\n</student>");
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("new_std.xml")));
pw.println(sb);
pw.close();
} catch (Exception e) {}
}

//startElement를 이용하여 XML문서 속성 정보 접근
public void startElement(String namespaceURI, String localName, String qName, Attributes attributes) {

if(qName.equals("phone")) {
sb.append("<" + qName + ">");
isPrint = true;
}

}
// 각 요소의 자료 출력

public void endElement(String namespaceURI, String localName, String qName) { // 요소의 끝
if(qName.equals("phone")) {
sb.append("</" + qName + ">");
isPrint=false;
}
}
public void characters(char ch[], int start, int length) {
String str=new String(ch, start, length);
if(str.trim().length() != 0 && isPrint == true) {
sb.append(str);
}
}

// sax를 하면서 기본적으로 처리 해야 할 것들 물론 생략도 가능하다.
}