Java XML 노드명 전체 가져오기
1. 노드 접근
XML DOM을 이용하면 노드 트리에 포함된 모든 노드에 접근할 수 있다. 노드 간의 관계는 다음과 같은 속성들로 정의된다.
parentNode
: 부모 노드childNodes
: 자식 노드 리스트firstChild
: 첫 번째 자식 노드lastChild
: 마지막 자식 노드nextSibling
: 다음 형제 노드previousSibling
: 이전 형제 노드
2. 노드명 전체 가져오기
XML을 파싱하면 주로 노드값을 가져온다. 그러나 노드명을 가져오는 경우도 있다.
아래는 노드명 전체를 가져오는 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class GetNodeName {
public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
String sampleXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<request>\n" +
" <header comment=\"헤더\">\n" +
" <cd comment=\"코드\"/>\n" +
" <org_cd comment=\"기관 코드\"/>\n" +
" <trns_org_cd comment=\"송신 기관 코드\"/>\n" +
" <rc_org_cd comment=\"수신 기관 구분코드\"/>\n" +
" <resp_cd comment=\"응답 코드\"/>\n" +
" <resp_msg comment=\"응답메시지\"/>\n" +
" </header>\n" +
" <body comment=\"바디\">\n" +
" <bank_cd comment=\"은행코드\"/>\n" +
" <acc_no comment=\"계좌번호\"/>\n" +
" <nme comment=\"성명\"/>\n" +
" <mact_bal comment=\"계좌잔액\"/>\n" +
" <cmsn comment=\"수수료\"/>\n" +
" <pyr_no comment=\"납부자번호\"/>\n" +
" </body>\n" +
"</request>";
InputStream is = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
factory.setExpandEntityReferences(false);
DocumentBuilder build = factory.newDocumentBuilder();
Document document = build.parse(is);
Element root = document.getDocumentElement(); // root 요소 가져오기
NodeList firstNodeList = root.getChildNodes();
IntStream.range(0, firstNodeList.getLength()).boxed().forEach(i -> {
Node firstNode = firstNodeList.item(i);
NodeList childNodeList = firstNode.getChildNodes();
IntStream.range(0, childNodeList.getLength()).boxed().forEach(j -> {
Node childNode = childNodeList.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) { // 노드의 타입이 Element일 경우(공백이 아닌 경우)
resultList.add(childNode.getNodeName());
}
});
});
}
}
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.