XML 문서 읽기
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 강좌 중에서...