DOM 파서로
XML 생성 및 조작하기
DOM 트리에 새로운 요소와 속성을 추가하거나 반대로 트리로부터 요소 및 속성을 삭제할 수도 있습니다.
▶ 노드를 생성하기 위한 메서드(Document 객체의 팩토리 메서드)
메소드 | 설명 |
Element createElement(String tagName) | Element 객체를 생성 |
Attr createAttribute(String name) | Att 객체를 생성 |
Text createTextNode(data) | Text 객체를 생성 |
Comment createComment(data) | Comment 객체를 생성 |
CDATASection createCDATASection(data) |
CDATASection 객체를 생성 |
▶ 노드의 추가, 삭제를 하기 위한 메서드(Node 인터페이스의 메서드)
메소드 | 설명 |
Node appendChild(Node newChild) | newChild를 자식 노드의 끝에 추가 |
Node removeChild(Node oldChild) | oldChild를 자식 노드에서 삭제 |
Node insertBefore(Node newChild, Node oldChild) | oldChild 앞에 newChild를 삽입 |
Node replaceChild(Node newChild, Node oldChild) | oldChild를 newChild로 교체 |
void setNodeValue(String nodeValue) | 노드의 값(텍스트 노드의 경우는 텍스트, 주석 노드의 경우는 주석 내용)을 설정 |
void setTextContent(String textContent) | 이 노드의 텍스트를 설정 |
새로운 XML 문서를 작성하고 조작해 봅시다.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class DOMParser {
public static void main(String[] args) throws ParserConfigurationException, IOException, TransformerException{
// XML 문서 파싱
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
// 새로운 XML 생성! //
// 새로운 Document 객체 생성
Document document = documentBuilder.newDocument();
// root 생성
Element root = document.createElement("class");
// root 속성 설정
root.setAttribute("name", "how to use xml parser");
// 자식 노드 생성
Element teacher = document.createElement("teacher");
teacher.setAttribute("name", "t1");
// 텍스트 설정
teacher.setTextContent("선생님입니다.");
Element teacher2 = document.createElement("teacher");
teacher2.setAttribute("name", "t2");
// 텍스트 설정
teacher2.setTextContent("선생님입니다.");
Element teacher3 = document.createElement("teacher");
teacher3.setAttribute("name", "t3");
// 텍스트 설정
teacher3.setTextContent("선생님입니다.");
// 자식 요소 추가
document.appendChild(root);
root.appendChild(teacher);
root.appendChild(teacher2);
root.appendChild(teacher3);
// XML 문자열로 변환하기! //
ByteArrayOutputStream out = new ByteArrayOutputStream();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(out);
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
// 출력 시 문자코드: UTF-8
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 들여 쓰기 있음
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(source, result);
System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8));
}
}
DOM 파서로
XML을 XPath에서 검색하기
XPath를 사용하면 DOM 트리의 임의의 노드를 쉽게 검색할 수 있습니다.
XPath는 XML 문서를 검색하기 위한 쿼리 언어입니다.
예를 들어, XML 문서 내에서 name 속성 값이 "s1"인 student 요소를 검색하는 XPath는 다음과 같습니다.
//student[@name='s1']
다음은 DOM 트리를 XPath를 사용해 검색하는 예제입니다.
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMParser {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException{
// XML 문서 파싱
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
Document document = documentBuilder.parse("sample.xml");
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
// XPath를 컴파일
XPathExpression expr = xpath.compile("//student");
XPathExpression expr2 = xpath.compile("//student[@name='s2']");
// XPath에서 XML 문서를 검색
Object result = expr.evaluate(document, XPathConstants.NODESET);
Object result2 = expr2.evaluate(document, XPathConstants.NODESET);
NodeList nodes = (NodeList)result;
for(int i = 0; i < nodes.getLength(); i++){
Element element = (Element)nodes.item(i);
System.out.println("att1: " + element.getAttribute("name"));
}
nodes = (NodeList)result2;
for(int i = 0; i < nodes.getLength(); i++){
Element element = (Element)nodes.item(i);
System.out.println("att2: " + element.getAttribute("name"));
}
}
}
실행 결과
expr은 student 요소를 모두 찾는 식이고,
expr2는 name 속성 값이 "s2"인 student 요소를 찾는 식입니다.
evaluate() 메서드로 XML 문서에 대해 검색하며, 반환값은 NodeList형입니다.
XPath는 선택하는 요소 이름을 /로 구분하여 지정합니다.
속성을 지정하는 경우는 "@속성명"으로 지정합니다.
아래는 자주 사용하는 XPath입니다.
예시 | 설명 |
student | 현재 노드 아래의 student 요소 |
./student | 현재 노드 아래의 student 요소 |
/student | root 노드 아래의 student 요소 |
//student | 트리 내의 모든 student 요소 |
student/* | student 요소 아래의 모든 노드 |
student/@name | student 요소의 name 속성 |
student[@name='s1'] | name 속성이 's1'인 student 요소 |
student[starts-with(@name,'s1')] | name 속성이 's1'로 시작하는 student 요소 |
//student[text()='abc'] | 텍스트가 'abc'인 student 요소 |
[출처] 자바 XML 처리 - DOM 파서(2) XML 생성 및 조작, xPath로 검색하기|작성자 예비개발자
728x90
반응형
'Back-end > JAVA & Spring' 카테고리의 다른 글
자바 이클립스에서 MariaDB 연결하기 (1) | 2021.07.13 |
---|---|
JDBC- MariaDB와 Java연동 (1) | 2021.07.09 |
자바 XML 처리 - DOM 파서(1) XML 읽기 (0) | 2021.06.22 |
[ Java ] TOLOWERCASE(), TOUPPERCASE(), TRIM() (1) | 2021.06.14 |
[Java] 문자열 치환(Replace) 사용법 & 예제 (0) | 2021.06.03 |
댓글