XML DOM 노드 트리 순회

순회(Traverse)는 노드 트리를 순회하는 것을 의미합니다.

노드 트리 순회

귀하는 종종 XML 문서를 순회해야 합니다. 예를 들어, 각 요소의 값을 추출하려고 할 때.

이 과정은 "노드 트리 순회"라고 합니다

다음 예제는 <book>의 모든 자식 노드를 순회하며 그 이름과 값을 표시합니다:

예제

<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>雅舍谈吃</title>" +
"<author>梁实秋</author>" +
"<year>2013</year>" +
"</book>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
// documentElement 始终表示根节点
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length ;i++) {
    txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
</script>
</body>
</html>

본인이 직접 시도해 보세요

例子解释:

  1. 将 XML 字符串加载到 xmlDoc
  2. 获取根元素的子节点
  3. 输出每个子节点的名称,以及其文本节点的节点值

浏览器在 DOM 解析方面的差异

所有现代浏览器都支持 W3C DOM 规范。

但是,浏览器之间存在一些差异。一个重要的区别是:

它们处理空白和换行的方式

DOM - 空白和换行

XML 通常在节点之间包含换行符或空白字符。当使用记事本等简单编辑器编辑文档时,通常会出现这种情况。

下面的例子(由记事本编辑)在每行之间包含 CR/LF(换行符),并且每个子节点前面有两个空格:

<book>
  <title>雅舍谈吃</title>
  <author>梁实秋</author>
  <press>江苏文艺出版社</press>
  <year>2013</year>
  <price>35</price>
  <ISBN>9787539962771</ISBN>
</book>

Internet Explorer 9 及更早版本不会将空白或新行视为文本节点,而其他浏览器则会这样做。

下面的例子将输出根元素(books.xml)拥有的子节点数。IE9 及之前版本会输出 6 个子节点,而 IE10 及以后版本以及其他浏览器会输出 9 个子节点:

예제

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "자식 노드 수: " + x.length;
}

본인이 직접 시도해 보세요

PCDATA - 파싱된 문자 데이터(Parsed Character Data)

XML 파싱기는 일반적으로 XML 문서의 모든 텍스트를 파싱합니다.

XML 요소를 파싱할 때, XML 태그 사이의 텍스트도 파싱됩니다:

<message>이 텍스트도 파싱됩니다</message>

파싱기가 이를 수행하는 이유는 XML 요소가 다른 요소를 포함할 수 있기 때문입니다. 예를 들어, <name> 요소는 다른 두 요소(first와 last)을 포함합니다:

<name><first>Bill</first><last>Gates</last></name>

파싱기는 다음과 같은 서브 요소로 분해합니다:

<name>
  <first>Bill</first>
  <last>Gates</last>
</name>

“파싱된 문자 데이터”(PCDATA)라는 용어는 XML 파싱기에 의해 파싱될 텍스트 데이터를 설명합니다.

CDATA - 파싱되지 않은 문자 데이터(Unparsed Character Data)

CDATA라는 용어는 XML 파싱기에 의해 파싱되지 않아야 할 텍스트 데이터를 설명합니다.

"<"과 "&" 등 문자는 XML 요소에서 불법적입니다.

"<"은 새로운 요소의 시작으로 해석됩니다.

"&"은 오류를 발생시킵니다. 이는 파싱기가 문자实体의 시작으로 해석하기 때문입니다.

일부 텍스트(예: JavaScript 코드)는 많은 "<" 또는 "&" 문자. 오류를 피하기 위해 스크립트 코드를 CDATA로 정의할 수 있습니다.

CDATA 부분 내의 모든 내용은 파싱기에 의해 무시됩니다.

CDATA 부분로 "<![CDATA[" 시작,로 "]]>" 종료:

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    } else {
        return 0;
    }
}
]]>
</script>

위의 예제에서, 파서는 CDATA 부분 내의 모든 내용을 무시합니다.

CDATA 부분에 대한 주의사항:

CDATA 부분에는 문자 "]]>". 중첩된 CDATA 부분은 허용되지 않습니다.

CDATA 부분 마침표를 나타내는 "]]>"에는 공백이나 개행 문자가 포함될 수 없습니다.