이번에 안드로이드 프로젝트를 하면서 XML-JAVA 상호작용을 이용해서 코딩을 해야했다.
예전에 조금 DOM tree를 다뤄본 기억은 있었지만,
2년 전이라 아무것도 기억이 나질 않았다.
다시는 까먹기 않기 위해, 하는 방법을 블로그 해보려 한다.
XML-JAVA 프로그래밍의 일반적인 흐름은 다음과 같을 것이다.
1. XML 문서를 파싱해서 Java로 데이터 옮겨오기
2. Java 클래스 안에서 DOM Tree 업데이트 하기
3. 변경된 DOM Tree를 다시 XML 문서로 전환하기
그럼 차근차근 보기로 하자.
1. XML 문서를 파싱해서 Java로 데이터 옮겨오기
여기서 가장 핵심적인 클래스를 보면 DocumentBuilder, DocumentBuilderFactory, Document
이 세가지 클래스를 볼 수 있다.
.....
DocumentBuiler builder;
DocumentBuilderFactory factory;
Document document;
location = "src/Data/userData.xml";
...................
위의 부분은 선언부이다. location은 해당 xml 파일이있는 주소를 알려주어야 한다.
다음은 위에서 선언한 인스턴스들을 초기화 해주는 과정이다.
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
document = builder.parse(location);
여기서 알아야 하는것은 많겠지만,
실질적으로 프로그램을 짤 때 알아야 할 사항은, 마지막 줄 정도밖에 없다.
마지막줄을 통해서 Java 프로그램은 location에 해당하는 XML 문서를 파싱하여 그 결과를 document 인스턴스에 저장하게 된다.
그 뒤에
document.getDocumentElement().normalize();
를 써주면 DOM Tree가 XML 문서의 구조대로 완성이 되는 것이다.
ROOT 노드를 가져오려면 어떻게 하느냐? 간단하다.
document.getDocumentElemnt()
는 이 DOM Tree의 루트 노드를 반환해준다.
이제 어떻게 조작하느냐는 어디까지나 JAVA API만 따라가면 된다.
Tree 구조를 아는 사람이라면, 메소드 이름만 API에찾아보고 순식간에 사용법을 익힐 수 있을 것이다.
참 쉽죠?
2. Java 클래스 안에서 DOM Tree 업데이트 하기
솔직히, DOM Tree를 업데이트 하는 방법은 사람마다 다를 것이라고 생각한다.
하지만 나는 좀 무식해서 일일이 트리 구조를 처음부터 다시 만든 뒤에, 노드를 교체해주는 방법을 택했다.
(혹시라도 다른 방법이 있다면 알고 싶다.)
교체를 하기 위해서는 다음과 같은 순서가 필요하다.
Element 만들기 -> 트리 구조 완성하기 -> 노드 변경하기
먼저, Element를 만드는 것. 참 쉽다.
Element eleName = document.createElement("name");
Element eleName2 = document.createElement("name2");
하면 만들어진다.
혹시라도 이 노드가 텍스트값을 가지는 노드라면,
eleName.setTextContent("TEXT");
이 메소드를 써주면 쉽게 설정할 수 있다.
트리 구조 완성하기? 쉽다.
그냥 자식 노드 붙이는거라고 생각하면 된다.
만약 앞서 만든 eleName2 노드가 eleName의 자식노드라면,
eleName.appendChild(eleName2);
해주면 설정 완성이다.
이것도 참 간단하다.
그 다음 노드 교체하기.
만약에 내가 루트 노드의 첫번째 자식노드와 eleName 노드를 교체하고 싶다면 다음과 같이 하면 된다.
document.getDocumentElemnt().replaceChild(eleName, document.getDocumentElement().getFirstChild());
그럼 그냥 바꿔진다.
이것도 정말 쉽다.
내가 하루만에 API만 보고 익힌거면 쉬운거다.
3. 변경된 DOM Tree를 다시 XML 문서로 전환하기
처음엔 이게 막막했다.
그런데 온라인에서 예제 보고 따라하니까 이게 제일 쉽더라.-_-ㅋ
여기서 중요한 클래스는 다음과 같다: TransformFacory, Transformer
나머지 클래스들은 부수적인거다.
다음의 예를 보면 금방 이해가 될거다.
...
TransormerFactory transfactory = TransformerFactory.newInstance();
Transformer trans = transfactory.newTransformer();
trans.setOutputProperty(OutputKeys.METHOD, "xml");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = nw DOMSource(document);
trans.transform(source, result);
File file = new File("src/Data/userData1.xml");
BufferedWriter writer = new BufferedWriter(new FileWriter(file, false));
writer.write(sw.toString);
writer.flush();
writer.close();
...
예제만 따라가보면 어떻게 동작하는지 알게 될 것이다.
여기서 내가 새롭게 알게된 아주 편리한 팁!!
new FileWriter(file, false));여기서, false를 true로 바꿔주면 파일의 뒤쪽부터 이어쓰기로 전환이 된다.
처음에는 이 방법을 몰라서 끙끙댔는데,
알고보니 참 편한 생성자다.
[
'자기 개발 > Java' 카테고리의 다른 글
이클립스 .class 파일 못찾을때 Source not found (0) | 2013.12.15 |
---|---|
자바 컬렉션 프레임워크(Collection FrameWork) (0) | 2013.09.08 |
좋은 자바프로그램을 만들기 위해서 (0) | 2013.09.05 |
추상클래스 와 인터페이스 차이2 (0) | 2013.09.05 |
추상클래스와 인터페이스 차이 (0) | 2013.09.05 |