2013년 8월 13일 화요일

[ORACLEJAVA커뮤니티, XML]C# JAVA DOM 예제

-------------------------------
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);
} } }    }


댓글 없음:

댓글 쓰기