SSKK 2008. 8. 30. 22:08
1. XML 문서에 대한 Document 객체 생성

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 강좌 중에서...