'3. Implementation/Markup Language'에 해당되는 글 11건
- 2012.04.20 XPath Axes
- 2009.05.07 초급 DTD 사용 예제
- 2009.04.21 xsl:call-template 예제
- 2008.08.31 RMI 개요
- 2008.08.31 XML-RPC
- 2008.08.30 JDOM의 등장
- 2008.08.30 SAX 핸들러 구현
- 2008.08.30 XML 문서 편집
- 2008.08.30 XML 문서 읽기
- 2008.08.30 DOM API 계층 구조
- 2008.08.07 XML 파서의 종류
XML 을 꽤 오랫동안 사용해 왔지만 늘 사용하는 것만 사용하게 되는 것 같습니다. XPath 에서 사용할 수 있는 축에 대해서 소개하는 글입니다.
출처: http://www.w3schools.com/xpath/xpath_axes.asp
AxisName | Result |
---|---|
ancestor | Selects all ancestors (parent, grandparent, etc.) of the current node |
ancestor-or-self | Selects all ancestors (parent, grandparent, etc.) of the current node and the current node itself |
attribute | Selects all attributes of the current node |
child | Selects all children of the current node |
descendant | Selects all descendants (children, grandchildren, etc.) of the current node |
descendant-or-self | Selects all descendants (children, grandchildren, etc.) of the current node and the current node itself |
following | Selects everything in the document after the closing tag of the current node |
following-sibling | Selects all siblings after the current node |
namespace | Selects all namespace nodes of the current node |
parent | Selects the parent of the current node |
preceding | Selects all nodes that appear before the current node in the document, except ancestors, attribute nodes and namespace nodes |
preceding-sibling | Selects all siblings before the current node |
self | Selects the current node |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Employees SYSTEM "spec.dtd" > <Employees> <Employee name=" <Department dptID="&DPT_DEVELOP;">&DPT_DEVELOP_STR;</Department> </Employee> <Employee name="심청이" age="29" sex="Female" > <Department dptID="&DPT_SALES;">&DPT_SALES_STR;</Department> </Employee> <Employee name="장보고" age="42" sex="Male" > <Department dptID="&DPT_TRADE;">&DPT_TRADE_STR;</Department> </Employee> </Employees> |
spec.dtd
<?xml version="1.0" encoding="UTF-8"?> <!-- 파라미터 --> <!ENTITY % varSex "Male|Female"> <!ENTITY DPT_DEVELOP "0" > <!ENTITY DPT_DEVELOP_STR "개발" > <!ENTITY DPT_SALES "1" > <!ENTITY DPT_SALES_STR "영업" > <!ENTITY DPT_TRADE "2" > <!ENTITY DPT_TRADE_STR "무역" > <!ELEMENT Employees (Employee*)> <!ELEMENT Employee (Department)> <!ATTLIST Employee name CDATA #REQUIRED age CDATA #REQUIRED sex (%varSex;) #REQUIRED hobby CDATA #IMPLIED > <!ELEMENT Department (#PCDATA) > <!ATTLIST Department dptID CDATA #REQUIRED > |
< 참고 >
? : 0 또는 1회
+ : 1 또는 무한대
* : 0 또는 무한대
엘리먼트 선택자 :
, : And, 반드시 순서대로 나와야 한다.
Html
Keywords : !ENTITY, !ELEMENT, !ATTLIST, #PCDATA, CDATA
참고 : XML 기초 플러스 (성안당)
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="makeTable.xsl"?> <Persons> <Person name="Tom" age="19" department="Sales" /> <Person name="Jane" age="23" department="Development" /> <Person name="Sam" age="14" department="HumanResource" /> <Person name="Paul" age="40" department="Sales" /> <Person name="Kazuya" age="28" department="HumanResource" /> <Person name="Baek doo san" age="32" department="Development" /> </Persons> |
makeTable.xml
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/Persons"> <table border="1" cellpadding="1" cellspacing="1"> <xsl:apply-templates select="/Persons/Person"/> </table> </xsl:template> <xsl:template match="/Persons/Person"> <xsl:call-template name="makeTable"> <xsl:with-param name="age"> <xsl:value-of select="./@age"/> </xsl:with-param> <xsl:with-param name="department"> <xsl:value-of select="./@department"/> </xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template name="makeTable"> <xsl:param name="age"/> <xsl:param name="department"/> <tr> <td> <xsl:element name="font" > <xsl:attribute name="color">blue</xsl:attribute> <xsl:value-of select="./@name" /> </xsl:element> </td> <td> <xsl:value-of select="$age" /> </td> <td> <xsl:choose> <xsl:when test="$age > 20">Adult</xsl:when> <xsl:otherwise>Student</xsl:otherwise> </xsl:choose> </td> <td> <xsl:value-of select="$department" /> </td> <td> <xsl:choose> <xsl:when test="$department='Development'"><xsl:text disable-output-escaping="yes">Hard&nbsp;Work</xsl:text></xsl:when> <xsl:otherwise>Easy</xsl:otherwise> </xsl:choose> </td> </tr> </xsl:template> </xsl:stylesheet> |
결과 화면
Tom | 19 | Student | Sales | Easy |
Jane | 23 | Adult | Development | Hard Work |
Sam | 14 | Student | HumanResource | Easy |
Paul | 40 | Adult | Sales | Easy |
Kazuya | 28 | Adult | HumanResource | Easy |
Baek doo san | 32 | Adult | Development | Hard Work |
keywords : xsl:template; xsl:call-template; xsl:with-param; xsl:param; xsl:choose; xsl:text
RMI (Remote Method Invocation) 기술
RMI의 개요
다른 Java 인터프리터 상에 생성되어 있는 리모트 객체에 접근하여 원하는 메서드를 실행하고 그 결과를 리턴받는 기능을 구현하는 기술입니다.
UNIX에서 지원한 RPC의 장점을 살리고 CORBA 스펙을 적용하여 Java만의 분산 객체 어플리케이션을 쉽게 만들 수 있는 개념을 제시했는데 이것이 바로 RMI(Remote Method Invocation)입니다.
RMI의 구성요소
l 리모트 클래스
리모트 객체로 생성될 수 있는 클래스, 리모트에서 호출 가능한 메서드를 정의하고 있는어야 함
l RMI 서버
리모트에서도 참조 가능한 객체를 생성하고 등록하는 기능의 프로그램
l RMI 클라이언트
리모트의 객체를 참조하여 필요한 기능을 분산 처리하려는 프로그램
l RMI Naming Server
리모트 객체를 “이름” 정보로 등록하고 찾아 주는 프로그램
RMI의 수행 흐름
1. 등록
RMI 서버가 리모트 클래스의 객체를 생성하여 RMI Naming Server에 등록
2. 요청
RMI 클라이언트가 RMI Naming Server에서 리모트 객체를 요청하여 찾음
3. RMI
필요한 리코트 메서드를 호출
출처 : e-Campus 강좌 중에서…
1. 분산 환경에서의 통신 방법
l 메시지 전달방식(message passing)
Socket
: 메시지를 전달하는 것이 하나의 프로세스
l 요청/응답방식(request/response)
HTTP, RPC, CORBA, DCOM, RMI
: 메시지를 전달(request)하고 결과(response)를 되돌려 받는 것이 하나의 프로세스
à 내부적인 함수 호출과 동일한 방식 가능
2. RPC(Remote Procedure Call)
한 프로그램이 네트워크상의 다른 컴퓨터에 위치하고 있는 프로그램에 서비스를 요청하는데 사용되는 프로토콜이다.
같은 프로그램내의 함수(Procedure)를 호출하는 것과 같이 원격 프로그램내의 함수를 호출해서 결과를 받는다.
요청하는 프로그램이 원격 절차의 처리 결과가 반환 될 때 까지 일시 정지되어야 하는 동기식 운영이다.
ORPC(Object RPC)는 객체지향 개념을 도입한 RPC로서 객체의 메소드를 호출하고 파라미터로 객체를 직접 전송한다.
3. XML-RPC
XML 기반의 분산 시스템 통신방법으로서 HTTP를 통하여 간단하고 이식성 높은 원격 프로시저 호출을 지원한다. 리모트 프로시저의 호출에 대하여 XML 형태로 매개변수나 리턴값을 인코딩한다.
l 구현 언어 중립 기술
à XML-RPC는 Perl, Java, C, C++, PHP와 그 외 다른 많은 언어로 사용할 수 있으며 Unix, Windows, 그리고 Macintosh에서 실행할 수 있다.
l XML-RPC의 통과 방식
4. 지원되는 데이터 유형
l XML-RPC이 지원하는 데이터형
int(i4) |
부호 있는 32비트 정수형 |
string |
NULL 바이트를 포함할 수 있는 아스키 문자열 (일부에서는 유니코드를 지원함) |
Boolean |
참 또는 거짓 |
double |
배정도 실수형 |
dataTime.iso8601 |
날짜와 시각. XML-RPC는 타임존의 사용을 금하기 때문에 거의 쓸모 없음 |
base64 |
임의의 길이를 가지는 저수준 이진 데이터 |
array |
1차원 배열. 배열 값은 어떠한 형도 가능함 |
struct |
key-value의 쌍으로 이루어진 구조체형 |
l XML-RPC 데이터 유형과 전달되는 유형
XML-RPC 데이터형 |
파서에 의해 생성되는 데이터형 |
핸들러에 정의된 유형 |
<i4> or <int> <Boolean> <string> <double> <dateTime.iso8601> <struct> <array> <base64> |
java.lang.Integer java.lang.Boolean java.lang.String java.lang.Double java.util.Date java.util.Hashtable java.util.Vector byte[ ] |
int bolean java.lang.String double java.util.Date java.util.Hashtable java.util.Vector byte[ ] |
5. XML-PRC 외의 다른 프로토콜
l SOAP
SOAP은 XML-PRC와 매우 유사하며 XML-PRC를 발전/표준화시킨 기술이다.
SOAP 역시 HTTP와 XML 문서를 통해 프로시저를 호출한다.
최초의 공개 릴리즈는 XML-RPC의 기본이 되고 있으며 네임스페이스와 긴 요소 이름을 사용할 수 있도록 하였다.
W3C Working group은 SOAP에 의해 여러 다양한 기능들이 추가되었다.
SOAP는 XML Schemas, enumerations, struct와 array의 혼합, 그리고 사용자 정의 데이터 유형등을 지원한다. 플랫폼에 따라 몇 가지 형태의 SOAP이 제시되었다.
XML-RPC와 유사하지만 더 많은 기능을 지원하는 프로토콜을 찾는다면 SOAP을 고려한다.
6. XML-RPC의 장점
HTTP를 이용하므로 Web 상의 모든 종류의 어플리케이션과 상호 동작이 가능하며 객체 기반의 통신을 가느하게 한다.
독자적인 HTTP 서버 클래스로도 사용 가능하다.
간단한 구조로 인해서 성능이 향상되며 구현이 간단하고 용이하다.
플랫폼 및 개발 언어에 독립적이며 상대적으로 개발 비용이 적게 든다.
인터넷표준(HTTP)를 사용함으로써 어떤 다른 기술보다 인터넷 적용성을 지원한다.
안정성 및 상호운용성(interoperability) 확보하고 있다.
7. XML-RPC 환경 구축
l Apache 사이트에서 XML-RPC 지원 API아 Xerces API를 다운로드
à http://xml.apache.org/
l SUN 사이트에서도 XML-RPC API를 다운로드
à http://java.sun.com/xml/jaxrpc/index.html
다운로드한 jar 파일을 Java 2 SDK가 설치된 디렉토리의 jre/lib/ext 디렉토리에 저장’
8. XML-RPC의 구현
l 매개변수의 전달
매개변수는 XML-PRC 에서 지정된 타입으로 변환되어야 한다.
기본형은 Wrapper 클래스의 객체로 전달된다.
Byte, Integer, Vector, Hashtable 등의 타입을 지원한다.
매개변수 리스트는 Vector로 넘어간다.
l 반환값
반환값은 항상 Object 타입으로 리턴된다.
반환값은 미리 약속된 타입으로 캐스팅하여 사용한다.
예제 소스 :
출처 : e-Campus 강좌 중에서...
DOM, SAX 그리고 JDOM API의 관계
JDOM API의 설치
1. JDOM 다운로드
2. 압축 풀기
jdom-b7 이라는 디렉토리가 만들어 진다.
3. 환경 변수 설정
JAVA_HOME
4. JDOM API 생성
JDOM 압축을 푼 디렉토리에 build.xml 와 build.bat 파일이 DT는 지 확인
build.bat를 수행시켜서 성공적으로 수행되면 “build successful”이라는 메시지가 출려됨.
5. JDOM API 생성
JDOM 프로그램의 컴파일을 위해 JAVA_HOME디렉토리의 jre/lib/ext 디렉토ㅗ리에 복사한다.
jdom.jar, jaxp.jar, xerces.jar, xalan.jar, crimson.jar
출처 : e-Campus 강좌 중에서
필요한 메서드만을 오버라이딩 하여 구현할 수 있도록 이 인터페이들 모두 상속하여 각 인터페이스에 정의되어 있는 abstract 메서드들을 오버라이딩한 DefaultHandler 클래스를 사용한다.
2. 특정 요소만 추출하여 XML 문서 작성하는 SAX 예제
import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; class SAXSample04 { public static void main(String args[]) throws Exception { //SAX를 준비한다 SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); //핸들러를 준비한다 SampleHandler04 sh = new SampleHandler04(); //문서를 읽어들인다 sp.parse(new FileInputStream("student.xml"), sh); } } //핸들러 클래스 class SampleHandler04 extends DefaultHandler { //문자열을 준비한다 StringBuffer sb = new StringBuffer(); boolean isPrint = false; //문서의 시작 public void startDocument() { sb.append ("<?xml version=\"1.0\" encoding=\"EUC-KR\" ?>"); sb.append("<초등학생>"); } //문서의 종료 public void endDocument() { sb.append("</초등학생>"); //문자열을 써넣는다 try{ PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter("result04.xml"))); pw.println(sb); pw.close(); }catch(Exception e){} } //요소의 시작 public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) { if(qName.equals("이름")){ sb.append("<" + qName + ">"); isPrint = true; } } //요소의 종료 public void endElement(String namespaceURI, String localName, String qName) { if(qName.equals("이름")){ 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); } } }
3. 특정 속성만 추출하여 XML 문서 작성하는 SAX 예제
import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; class SAXSample05 { public static void main(String args[]) throws Exception { //SAX를 준비한다 SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); //핸들러를 준비한다 SampleHandler05 sh = new SampleHandler05(); //문서를 읽어들인다 sp.parse(new FileInputStream("student.xml"), sh); } } //핸들러 클래스 class SampleHandler05 extends DefaultHandler { //문자열을 준비한다 StringBuffer sb = new StringBuffer(); //문서의 시작 public void startDocument() { sb.append ("<?xml version=\"1.0\" encoding=\"EUC-KR\" ?>"); sb.append("<초등학생>"); } //문서의 종료 public void endDocument() { sb.append("</초등학생>"); //문자열을 써넣는다 try{ PrintWriter pw = new PrintWriter (new BufferedWriter(new FileWriter("result05.xml"))); pw.println(sb); pw.close(); }catch(Exception e){} } //요소의 시작 public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) { if(qName.equals("이름")) { for(int i=0; i<attrs.getLength(); i++) { sb.append("<" + attrs.getQName(i) + ">"); sb.append(attrs.getValue(i)); sb.append("</" + attrs.getQName(i) + ">"); } } } }
출처 : e-campus 강좌 중에서
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser06 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc = parser.parse("student.xml"); //문서의 출발점을 얻는다 Element root = xmldoc.getDocumentElement(); //노드의 자식(child)노드를 찾아간다 getNode(root); //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc; BufferedWriter bw = new BufferedWriter(new FileWriter("student_addelement.xml")); xdoc.write(bw,"EUC-KR"); } //노드의 자(child)를 찾아간다 public static void getNode(Node n) { for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()) { //요소를 처리한다 if(ch.getNodeType() == Node.ELEMENT_NODE){ if(ch.getNodeName().equals("초등학생")){ Document doc = ch.getOwnerDocument(); Element comp = doc.createElement("주소"); Text txt = doc.createTextNode("서울시 송파구"); ch.appendChild(comp); comp.appendChild(txt); } getNode(ch); } } } }
2. 원하는 요소의 삭제
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser07 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc = parser.parse("student.xml"); //문서의 출발점을 얻는다 Element root = xmldoc.getDocumentElement(); //노드의 자식(child)노드를 찾아간다 getNode(root); //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc; BufferedWriter bw = new BufferedWriter(new FileWriter("student_delelement.xml")); xdoc.write(bw,"EUC-KR"); } //노드의 자(child)를 찾아간다 public static void getNode(Node n) { for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){ //요소를 처리한다 if(ch.getNodeType() == Node.ELEMENT_NODE){ if(ch.getNodeName().equals("주소")){ Node pr = ch.getParentNode(); pr.removeChild(ch); } getNode(ch); } } } }
3. 요소에 새로운 텍스트를 추가
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser08 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc = parser.parse(new FileInputStream("student.xml")); //문서의 출발점을 얻는다 Element root = xmldoc.getDocumentElement(); //노드의 자식(child)노드를 찾아간다 getNode(root); //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc; BufferedWriter bw = new BufferedWriter(new FileWriter("student_addtext.xml")); xdoc.write(bw,"EUC-KR"); } public static void getNode(Node n) { for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){ //요소를 처리한다 if(ch.getNodeType() == Node.ELEMENT_NODE){ if(ch.getNodeName().equals("초등학생")){ Document doc = ch.getOwnerDocument(); Text txt = doc.createTextNode("초등학생 자료입니다."); ch.appendChild(txt); } getNode(ch); } } } }
4. 새로운 속성을 추가
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser09 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc = parser.parse("student.xml"); //문서의 출발점을 얻는다 Element root = xmldoc.getDocumentElement(); //노드의 자식(child)노드를 찾아간다 getNode(root); //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc; BufferedWriter bw = new BufferedWriter(new FileWriter("student_addattr.xml")); xdoc.write(bw,"EUC-KR"); } //노드의 자(child)를 찾아간다 public static void getNode(Node n) { for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){ //요소를 처리한다 if(ch.getNodeType() == Node.ELEMENT_NODE) { if(ch.getNodeName().equals("초등학생")) { Element elm =(Element) ch; elm.setAttribute("학년", "3"); } getNode(ch); } } } }
5. 원하는 속성을 삭제
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser10 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc = parser.parse("student.xml"); //문서의 출발점을 얻는다 Element root = xmldoc.getDocumentElement(); //노드의 자식(child)노드를 찾아간다 getNode(root); //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc; BufferedWriter bw = new BufferedWriter(new FileWriter("student_delattr.xml")); xdoc.write(bw,"EUC-KR"); } //노드의 자식(child)노드를 찾아간다 public static void getNode(Node n) { for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()) { //요소를 처리한다 if(ch.getNodeType() == Node.ELEMENT_NODE) { if(ch.getNodeName().equals("이름")) { NamedNodeMap attrmap = ch.getAttributes(); attrmap.removeNamedItem("성별"); } getNode(ch); } } } }
6. 원하는 요소들을 추출하여 새로운 XML을 작성
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser11 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc1 = parser.parse(new FileInputStream("student.xml")); //문서를 새로 작성한다 Document xmldoc2 = parser.newDocument(); //루트 요소를 추가한다 Element root = xmldoc2.createElement("어린이"); xmldoc2.appendChild(root); //요소를 추출한다 NodeList lst = xmldoc1.getElementsByTagName("이름"); for(int i=0; i<lst.getLength(); i++){ Node n = lst.item(i); for(Node ch = n.getFirstChild();ch != null;ch = ch.getNextSibling()){ Element elm = xmldoc2.createElement("이름"); Text txt = xmldoc2.createTextNode(ch.getNodeValue()); elm.appendChild(txt); root.appendChild(elm); } } //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc2; BufferedWriter bw = new BufferedWriter(new FileWriter("student_new.xml")); xdoc.write(bw,"EUC-KR"); } }
7. 원하는 속성들을 추출하여 새로운 XML을 작성
import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*; import org.apache.crimson.tree.*; public class DOMParser12 { public static void main(String args[]) throws Exception { //DOM를 준비한다 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); //문서 읽어들이기 Document xmldoc1 = parser.parse(new FileInputStream("student.xml")); //문서를 새로 작성한다 Document xmldoc2 = parser.newDocument(); //루트 요소를 추가한다 Element root = xmldoc2.createElement("어린이"); xmldoc2.appendChild(root); //요소를 추출한다 NodeList lst = xmldoc1.getElementsByTagName("이름"); for(int i=0; i<lst.getLength(); i++){ Node n = lst.item(i); NamedNodeMap attrlist = n.getAttributes(); Node attr = attrlist.getNamedItem("성별"); Element elm = xmldoc2.createElement("성별"); Text txt = xmldoc2.createTextNode(attr.getNodeValue()); elm.appendChild(txt); root.appendChild(elm); } //문서 써넣기 XmlDocument xdoc = (XmlDocument) xmldoc2; BufferedWriter bw = new BufferedWriter(new FileWriter("student_newattr.xml")); xdoc.write(bw,"EUC-KR"); } }
참고 : e-Campus 강좌 중에서...
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInsance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document xmldoc = parser.parse(“sample.xml”);
Element root = xmldoc.getDocumentElement();
System.out.println(root);
2. 요소명만 추출
공백을 나타내는 텍스트 노드는 제외하고 요소명만 출력하려면 추출된 노드의 타입을 점검하여 Node.ELEMENT_NODE인 경우에만 노드 명을 출력하도록 구현한다.
Element root = doc.getDocumentElement();
for(Node ch = root.getFirstChild(); ch != null; ch = ch.getNextSibling()) {
if( ch.getNodeType() == Node.ELEMENT_NODE)
System.out.println(ch.getNodeName());
}
3. 모든 자식 요소 추출
각각의 자식 노드에 대해서도 getNode() 메서드를 호출하여 자식의 자식 노드들도 추출하도록 구현한다. 재귀함수 기법을 활용한다.
Element root = xmldoc.getDocumentElement();
getNode(root);
public static void getNode(Node n) {
for(Node ch=n.getFirstChild(); ch!=null; ch = ch.getNextSibling()) {
if(ch.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(ch.getNodeName());
getNode(ch);
}
else if(ch.getNodeType() == Node.TEXT_NODE &&
ch.getNodeValue().trim().length() != 0) {
System.out.println(ch.getNodeValue());
}
}
}
4. 노드들의 타입에 따른 파싱
Node 인터페이스에서 지원되는 getNodeType()이라는 메서드를 사용하여 인식된 자식 노드가 어떠한 타입 노드인지에 따라 처리한다.
Type |
Parsing |
Node.DOCUMENT_NODE |
DocumentElement 객체 정보를 가지고 printString()을 호출 |
Node.ELEMENT_NODE |
요소명, 속성 정보(이름, 값)을 추출하여 xmlString에 저장하고 자손 요소 정보를 가지고 printString()을 호출 |
Node.CDATA_SECTION_NODE |
추출된 값에 <![CDATA [ 와 ]]> 을 추가 |
Node.TEXT_NODE |
값만 추출 |
Node.PROCESSING_INTRUCTION_NODE |
추출된 값에 <? 와 ?> 을 추가 |
5. 노드들의 타입에 따른 파싱
각 노드 타입에 따라 처리하고 추출된 XML 문서의 내용을 하나의 문자열로 리턴하는 메서드이다.
private String xmlString = “”;
public String printString(Node node) {
int type = node.getNodeType();
switch(type0 {
case Node.DOCUMENT_NODE:
printString(((Document)node).getDocumentElement());
break;
case Node.ELEMENT_NODE:
xmlString += “<” + node.getNodeName();
NamedNodeMap attrs = node.getAttributes();
for(int i=0; i<attrs.getLength(); i++){
Node attr = attrs.item(i);
xmlString += “ “ + attr.getNodeName() + “=’” + attr.getNodeValue() + “’”;
xmlString += “>”;
NodeList children = node.getChildNodes();
if(children != null) {
for(int i=0; i<children.getLength(); i++{
printString(children.item(i));
}
}
break;
}
case Node.CDATA_SECTION_NODE:
xmlString += “<![CDATA [“ + node.getNodeValue() + “][>”;
break;
case Node.TEXT_NODE;
xmlString += node.getNodeValue().trim();
break;
case Node.PROCESSING_INSTRUCTION_NODE:
xmlString += “<?” + node.getNodeName() + “ “ + node.getNodeValue() + “?>”;
break;
}
if(type == Node.ELEMENT_NODE){
xmlString += “</” + node.getNodeName() + “>”;
}
return xmlString;
}
출처 : e-Campus 강좌 중에서...
Keyword;
DOMImplementation; DOMException; Node; NodeList; NamedNodeMap; DocumentFragment;Document;
DocumentType;Element;Attr;CharacterData;Entity;EntityReference;Notation;ProcessingInstruction;Test;
CDATASection;Comment
파서의 종류 |
설명 |
Microsoft XML Parser*MSXML) |
IE5가 출시된 이후, XML 기술의 사용이 좀더 나아졌으며 XML 버전 1.0 스펙을 반영하게 되었다. |
James Clark’s XP |
James Clark의 XP는 java로 구현되어 있으며, 외부 DTD와 Well-formed 문서에 대한 검사를 할 수 있다. |
Apache Xerces |
오픈 소스 그룹인 Apache의 파서는 C++버전과 Java버전 2가지가 있으며, Java 버전의 경우 Java로 개발되는 대부분의 XML 애플리케이션에서 사용되고 있다. |
IBM XML 4c, 4J |
IB에서 나오는 C++및 Java버전의 XML 파서이다. |
XML Parser for Java, for C, for C++ |
오라클에서 Oracle XML Developer’s Kt이란 이름으로 제공하는 Java, C, C++ 버전의 파서이다. |
출처 : www.e-campus.co.kr 교육 과정 중에서