: XML DOM(문서 객체 모델, Document Object Model)은 XML 문서를 조작하기 위한 표준화된 방식이다.
<p id="demo"></p>
<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
myFunction(this);
}
};
xhttp.open("GET", "books.xml", true);
xhttp.send();
function myFunction(xml) {
var xmlDoc = xml.responseXML;
document.getElementById("demo").innerHTML
= xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>
<title> 요소를 선택.<title> 요소의 첫 번째 자식 노드(텍스트 노드)를 선택.<library>
<book id="1">
<title>XML Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced XML</title>
<author>Jane Smith</author>
</book>
</library>
x.nodeNamenodeName은 특정 노드의 이름을 반환한다.코드 예시:
var x = xmlDoc.getElementsByTagName("title")[0];
console.log(x.nodeName); // "title"
<title> 노드의 이름을 출력한다.x.nodeValuenodeValue는 노드의 값을 반환한다. 요소 노드에선 null이지만, 텍스트 노드에서 텍스트 값을 가져온다.코드 예시:
var x = xmlDoc.getElementsByTagName("title")[0].childNodes[0]; // 텍스트 노드
console.log(x.nodeValue); // "XML Basics"
<title> 요소 안에 있는 텍스트 값인 "XML Basics"을 반환합니다.x.parentNodeparentNode는 현재 노드의 부모 노드를 반환합니다.코드 예시:
var x = xmlDoc.getElementsByTagName("title")[0];
console.log(x.parentNode.nodeName); // "book"
<title> 노드의 부모는 <book> 노드이므로 "book"을 반환합니다.x.childNodeschildNodes는 자식 노드를 배열처럼 반환합니다. 텍스트 노드와 같은 노드들도 포함됩니다.코드 예시:
var x = xmlDoc.getElementsByTagName("book")[0];
console.log(x.childNodes[1].nodeName); // "title"
console.log(x.childNodes[1].childNodes[0].nodeValue); // "XML Basics"
<book> 노드의 두 번째 자식 노드는 <title>, 그 안의 첫 번째 자식 노드는 "XML Basics"라는 텍스트 값을 가집니다.x.attributesattributes는 요소 노드의 속성을 배열처럼 반환합니다.코드 예시:
var x = xmlDoc.getElementsByTagName("book")[0];
console.log(x.attributes[0].name); // "id"
console.log(x.attributes[0].value); // "1"
<book> 요소의 첫 번째 속성은 "id"이며, 그 값은 "1"입니다.x.getElementsByTagName(name)document.getElementsByTagName("title")은 XML 문서에서 모든 <title> 요소를 반환한다.x.appendChild(node)node를 현재 노드의 자식으로 추가한다.<book></book>에 newNode를 appendChild 하면 <book><newNode></newNode></book> 형태가 된다.x.removeChild(node)node 자식 노드를 제거합니다.<book><title>Book</title></book>에서 <title> 노드를 removeChild 하면 <book></book>이 됩니다.: XML DOM에서는 XML 문서의 모든 것이 노드로 간주된다.
<book>, <title>)는 요소 노드로 취급됩니다. 이 노드는 XML 구조의 핵심 구성 요소입니다.<title>XML Basics</title>에서 "XML Basics")는 텍스트 노드로 분리되어 저장됩니다.<book id="1">에서 id="1")은 속성 노드로 취급됩니다. 속성 노드는 요소 노드의 일부지만 자식 노드는 아닙니다.<!-- This is a comment -->)은 주석 노드로 간주됩니다. 주석은 데이터 처리에 영향을 미치지 않지만 문서에 기록된 정보를 설명하는 데 사용됩니다.: DOM 처리에서 흔히 발생하는 오류는 요소 노드에 텍스트가 포함될 것으로 예상하는 것이다.
<year>2005</year>에서 요소 노드 <year>는 값이 "2005"인 텍스트 노드를 보유한다.<year> 요소의 값이 아니라, 텍스트 노드의 값이다다!
: XML DOM은 XML 문서를 트리 구조로 나타낸다. 이 구조를 노드 트리라고 부른다.
: 세 가지 방법으로 노드에 엑세스할 수 있다.
: getElementsByTagName() 메소드는 node list를 반환한다.
x = xmlDoc.getElementsByTagName("title");
// 세 번째 `<title>`에 액세스
y = x[2];
: x의 <title> 요소는 색인 번호로 액세스할 수 있다.
function myFunction(xml) {
var x, i, txt, xmlDoc;
xmlDoc = xml.responseXML;
txt = "";
x = xmlDoc.getElementsByTagName("title");
for (i = 0; i < x.length; i++) {
txt += x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
}
: title 태그들을 싹 찾고, 해당 태그의 nodeValue를 추가하여 id가 demo인 태그에 삽입하는 구조.
function myFunction(xml) {
var xmlDoc = xml.responseXML;
document.getElementById("demo").innerHTML =
xmlDoc.documentElement.nodeName + "<br>" +
xmlDoc.documentElement.nodeType;
}
: 이 함수는 XML 파일에서 특정 정보를 가져와서 HTML 요소에 표시하는 역할을 한다.
<library>...</library>라는 구조라면, nodeName은 "library"가 된다.1 (요소 노드)이다.nodeType에 대한 설명: nodeType은 각 XML DOM 노드의 유형을 나타내는 숫자 값이다.
1<book>, <title>)는 1로 표현된다.2<book id="1">)은 2로 표현된다.3<title>XML Basics</title>에서 "XML Basics")는 3으로 표현된다.8<!-- This is a comment -->)은 8로 표현된다.99로 표현된다.function myFunction(xml) {
var x, i, xmlDoc, txt;
xmlDoc = xml.responseXML;
txt = "";
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length; i++) {
txt += x[i].nodeName + "<br>";
}
document.getElementById("demo").innerHTML = txt;
}
#text
book
#text
book
#text
book
#text
book
#text
#text가 나오는가?childNodes는 모든 자식 노드를 반환하며, 여기에는 텍스트 노드도 포함됩니다.#text가 나타납니다.nodeType을 사용해 필터링하면 됩니다.for (i = 0; i < x.length; i++) {
if (x[i].nodeType === 1) { // 요소 노드만 출력
txt += x[i].nodeName + "<br>";
}
}
book
book
book
book
book
이렇게 하면 공백 텍스트 노드가 출력되지 않고, <book> 요소들만 출력됩니다.
function myFunction(xml) {
var x, y, i, xlen, xmlDoc, txt;
xmlDoc = xml.responseXML;
x = xmlDoc.getElementsByTagName("book")[0]; // 첫 번째 <book> 요소
xlen = x.childNodes.length; // 자식 노드 수
y = x.firstChild; // 첫 번째 자식 노드
txt = "";
for (i = 0; i < xlen; i++) {
if (y.nodeType == 1) { // 요소 노드만 확인
txt += i + " " + y.nodeName + "<br>"; // 인덱스와 노드 이름 저장
}
y = y.nextSibling; // 다음 형제 노드로 이동
}
document.getElementById("demo").innerHTML = txt; // 결과 출력
}
nextSibling: 현재 노드의 다음 형제 노드를 참조한다y.nodeType == 1을 통해 요소 노드만 필터링하여 출력한다.function myFunction(xml) {
var x, y, i, xlen, xmlDoc, txt;
xmlDoc = xml.responseXML;
x = xmlDoc.getElementsByTagName("book")[0];
xlen = x.childNodes.length;
y = x.firstChild;
txt = "";
for (i = 0; i < xlen; i++) {
console.log(y);
if(y.nodeType == 1)
txt += i + " Node name: " + y.nodeName + "; Attri. value : " + y.getAttribute("lang")+ "<br>";
y = y.nextSibling;
}
document.getElementById("demo").innerHTML = txt;
}
#text.#document.<title>의 nodeName은 "title".<book category="COOKING">에서 category 속성의 nodeName은 "category".<year>2005</year>의 텍스트 노드에서 nodeName은 #text.nodeName은 #document.<title>의 nodeValue는 정의되지 않음.<book category="COOKING">에서 category 속성의 nodeValue는 "COOKING".<year>2005</year>의 텍스트 노드에서 nodeValue는 "2005".nodeValue는 정의되지 않음.이렇게 각 노드 유형에 대한 설명과 예시를 추가하여 내용을 간결하게 정리했습니다.
: 텍스트 노드의 값은 nodeValue를 통해 직접 변경할 수 있다. 이를 통해 XML 문서의 특정 내용을 동적으로 수정할 수 있는 강력한 기능을 제공한다.
function myFunction(xml) {
var xmlDoc = xml.responseXML;
var x;
x = xmlDoc.getElementsByTagName("title")[0].childNodes[0];
document.getElementById("demo1").innerHTML = x.nodeValue;
x.nodeValue = "Easy Cooking";
x = xmlDoc.getElementsByTagName("title")[0].childNodes[0];
document.getElementById("demo2").innerHTML = x.nodeValue;
}
x = xmlDoc.getElementsByTagName("title")[0].childNodes[0];
x는 첫 번째 <title> 요소의 첫 번째 자식인 텍스트 노드에 접근한다. 이 텍스트 노드는 초기값을 가진다.document.getElementById("demo1").innerHTML = x.nodeValue;
demo1 요소에 출력한다.x.nodeValue = "Easy Cooking";
x로 참조된 텍스트 노드의 값을 "Easy Cooking"으로 변경한다. nodeValue 속성은 텍스트 노드의 내용을 직접 수정할 수 있게 해준다.document.getElementById("demo2").innerHTML = x.nodeValue;
demo2 요소에 출력한다.function myFunction(xml) {
var x, txt,xmlDoc;
xmlDoc = xml.responseXML;
x = xmlDoc.getElementsByTagName("book")[0].attributes;
console.log(x);
txt = x.getNamedItem("category").nodeValue + "<br>" + x.length;
document.getElementById("demo").innerHTML = txt;
}
xmlDoc = xml.responseXML;
xml.responseXML을 통해 XML 문서의 DOM 객체를 가져옵니다.<book> 요소의 속성 접근:x = xmlDoc.getElementsByTagName("book")[0].attributes;
<book> 요소의 모든 속성(attribute)을 가져옵니다. x는 속성 목록을 포함하는 NamedNodeMap 객체입니다.txt = x.getNamedItem("category").nodeValue + "<br>" + x.length;
getNamedItem("category") 메소드를 사용하여 "category"라는 이름의 속성을 가져옵니다..nodeValue를 통해 해당 속성의 값을 출력합니다.x.length는 속성의 총 개수를 반환합니다.document.getElementById("demo").innerHTML = txt;
txt 변수를 HTML 요소에 출력하여 "category" 속성의 값과 총 속성 개수를 표시합니다.getNamedItem 메소드getNamedItem(name) 메소드는 특정 이름의 속성을 검색하고, 해당 속성을 Attr 노드로 반환한다.x.getNamedItem("category")는 "category"라는 속성의 정보를 가져온다. 만약 "category" 속성이 존재한다면, 해당 속성의 값을 nodeValue로 쉽게 접근할 수 있다.null을 반환한다. function myFunction(xml) {
var xmlDoc = xml.responseXML;
var x = get_firstChild(xmlDoc.getElementsByTagName("book")[0]);
document.getElementById("demo").innerHTML = x.nodeName;
}
//check if the first node is an element node
function get_firstChild(n) {
console.log(n);
var y = n.firstChild;
while (y.nodeType != 1) {
y = y.nextSibling;
}
console.log(y);
return y;
}
while (y.nodeType != 1) {
y = y.nextSibling;
}
y.nodeType != 1일 경우, 즉 비요소 노드(예: 텍스트 노드)일 때 다음 형제 노드로 이동한다.y는 첫 번째 요소 노드를 가리키게 된다.