DOM 예제 (C# 이용)
-------------------------------
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
CSharp.xml
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE document [
<!ELEMENT document (title, contents)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT contents (#PCDATA)>
<!ATTLIST document author CDATA #REQUIRED>
<!ATTLIST document page NMTOKEN #REQUIRED>
<!ENTITY html "HTML 문서">
]>
<?PIname PIdata?>
<document author="갑돌이" page="10">
<title>제목</title>
<contents>
다음은 &html;의 일부 입니다.
<![CDATA[
<html>
<head><title>제목</title></head>
<body>
<h1>HTML 문서</h1>
</body>
</html>
]]>
</contents>
</document>
XmlTextReaderTest.cs
using System;
using System.Xml;
public class XmlTextReaderTest {
static void Main(string[] args) {
XmlTextReader reader = new XmlTextReader(args[0]);
while(reader.Read()) {
switch(reader.NodeType) {
case XmlNodeType.XmlDeclaration:
Console.WriteLine("----- XML 선언부 -----");
break;
case XmlNodeType.Element:
Console.WriteLine("시작 엘리먼트 : {0}", reader.Name);
break;
case XmlNodeType.Text:
Console.WriteLine("문자열 : {0}", reader.Name);
break;
case XmlNodeType.CDATA:
Console.WriteLine("CDATA 섹션 : {0}", reader.Name);
break;
case XmlNodeType.ProcessingInstruction:
Console.WriteLine("처리명령 : {0}", reader.Name);
break;
case XmlNodeType.Comment:
Console.WriteLine("주석문 : {0}", reader.Name);
break;
case XmlNodeType.EntityReference:
Console.WriteLine("엔티티 참조 : {0}", reader.Name);
break;
case XmlNodeType.EndElement:
Console.WriteLine("끝 엘리먼트 : {0}", reader.Name);
break;
}
} } }
실행하기 위해서는 시작-> 프로그램->Visual Studio .NET->.NET TOOL->.NET 명령 프롬프트에서 csc XmlTextReaderTest.cs이라고 한후 컴파일을 하자..
그런다음 XmlTextReaderTest Csharp.xml 이라고 실행을 하면 된다.
-------------------------------------
XML 문서를 새로 만들기 예제
-------------------------------------
XmlDocCreate.java
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
class XmlDocCreate {
public static void main(String args[]) throws Exception {
//DOM을 준비 한다.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
//XML 문서를 새로 작성한다. 새로 작성된 문서는 빔
Document doc = db.newDocument();
//루트 요소를 추가 한다.
Element root = doc.createElement("cars");
doc.appendChild(root);
//문서를 써낸다. 만약 이부분에서 ClassCastingException 이 발생한다면 xercesImpl.jar에 대해 클래스패스 설정한것을 지울것
XmlDocument xdoc = (XmlDocument) doc;
BufferedWriter bw = new BufferedWriter(new FileWriter("result2.xml"));
xdoc.write(bw, "euc-kr");
bw.close();
} }
----------------------------------------
XML 문서내의 데이터 이용
----------------------------------------
Tree 구조
DOM에서는 XML 문서를 트리 구조로 취급한다. 문서내의 각 부분은 Node라고 불린다. 즉 XML 문서안의 요소, 속성, 텍스트등은 Node가 되는 것이다.
org.w3c.dom Package안의 Node인터페이스는 Node를 다루기 위한 다양한 메소드들이 정의 되어 있다.(API확인 하기 바람)
getNodeType 노드의 종류를 얻음
getNodeName 노드의 이름을 얻음
getNodeValue 노드 값을 얻음
car3.xml
<?xml version="1.0" encoding="euc-kr" ?>
<cars>
<car>
<name>승용차</name>
<price>150</price>
</car>
<car>
<name>트럭</name>
<price>500</price>
</car>
</cars>
TreeTraverse.java– 루트요소의 바로 아래 자식을 찾음
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
class TreeTraverse {
public static void main(String[] args) throws Exception{
//DOM을 준비 한다.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
//문서를 읽어 들인다.
Document doc = db.parse(new FileInputStream("car4.xml"));
//문서의 출발점을 얻음
Element root = doc.getDocumentElement();
//노드의 자식을 순회 한다.
walk(root);
}
public static void walk(Node n) {
//지정된 노드의 최초의 자식 노드로 부터, 자식이 있는 동안 형제를 찾아 반복적으로 노드를 탐색 함
for(Node ch = n.getFirstChild();ch != null; ch = ch.getNextSibling()) {
System.out.println(ch.getNodeName());
} } }
--------------------------------------
모든 노드를 찾는 예제
--------------------------------------
TreeTraverse2.java – 모든 노드를 찾음
walk 메소드를 아래와 같이 수정하자.
public static void walk(Node n) {
//지정된 노드의 최초의 자식 노드로 부터, 자식이 있는 동안
// 형제를 찾아 반복적으로 노드를 탐색 함
for(Node ch = n.getFirstChild();ch != null; ch = ch.getNextSibling()) {
if (ch.getNodeType() = Node.ELEMENT_NODE){
System.out.println(ch.getNodeName());
walk();
}
}
}
----------------------------------------
모든 노드와 해당 텍스트를 표시하는 예제
----------------------------------------
TreeTraverse3.java – 모든 노드와 해당 텍스트를 표시
walk 메소드의 if문을 아래와 같이 수정하자.
if (ch.getNodeType() == Node.ELEMENT_NODE){
System.out.println(ch.getNodeName());
walk(ch);
}
else if (ch.getNodeType() == Node.TEXT_NODE &&
ch.getNodeValue().trim().length() != 0){
System.out.println(ch.getNodeValue());
}
----------------------------------------
유용한 메소드
----------------------------------------
유용한 메소드
Document.getDocumentElement() : 문서의 루트요소 얻음
Node.getFirstNode() : 최초 자식을 얻음
Node.getNExtSibling() : 노드의 다음 형제를 얻음
Node.getNodeType() : 노드종류를 얻음
Node.getNodeName() : 노드이름을 얻음
Node.getNodeValue() : 노드의 노드 값(텍스트)을 얻음
데이터의 추가
읽어들인 XML 문서를 기초로 새로운 XML 문서를 작성 하거나 새로 작성된 XML 문서에 데이터를 조립해 나갈 수 있다.
요소를 추가 하거나 데이터로 만들어 추가 하거나 속성으로 만들어 추가하는 경우 등을 생각해 볼 수 있다.
데이터의 추가와 관련된 메소드
Document.createElement(String TagName)
문서의 “요소”를 작성 한다.
Document.createTextNode(String data)
문서의 “텍스트”를 작성 한다.
Node.getOwnerDocument()
노드의 “문서”를 얻는다.
Node.appendChild(Node newChild)
노드에 자식을 추가 한다.
car4.xml
<?xml version="1.0" encoding="euc-kr" ?>
<cars>
<car>
<name>승용차</name>
<price>150</price>
</car>
<car>
<name>트럭</name>
<price>500</price>
</car>
</cars>
ElementInsert.java
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.*;
class ElementInsert {
public static void main(String[] args) throws Exception{
//DOM을 준비 한다.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
//문서를 읽어 들인다.
Document doc = db.parse(new FileInputStream("car4.xml"));
//문서의 출발점을 얻음
Element root = doc.getDocumentElement();
//노드를 탐색 하자.
walk(root);
//문서를 써 낸다.
XmlDocument xdoc = (XmlDocument) doc;
BufferedWriter bw = new BufferedWriter(new FileWriter("result3.xml"));
xdoc.write(bw, "euc-kr");
bw.close();
System.out.println("노드 추가 OK~");
}
//****************** 노드를 탐색 한다.
public static void walk(Node n) {
//지정된 노드의 최초의 자식 노드로 부터, 자식이 있는 동안
// 반복적으로 노드를 탐색 함
for(Node ch = n.getFirstChild();ch != null; ch = ch.getNextSibling()) {
if (ch.getNodeType() == Node.ELEMENT_NODE) {
if (ch.getNodeName().equals("car")) {
Document doc = ch.getOwnerDocument();
Element comp = doc.createElement("company");
Text text = doc.createTextNode("대우자동차");
ch.appendChild(comp);
comp.appendChild(text);
}
walk(ch);
} } } }
댓글 없음:
댓글 쓰기