XML DOM 노드 트리 순회
- 이전 페이지 DOM 노드 목록
- 다음 페이지 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>
例子解释:
- 将 XML 字符串加载到
xmlDoc
中 - 获取根元素的子节点
- 输出每个子节点的名称,以及其文本节点的节点值
浏览器在 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 부분 마침표를 나타내는 "]]>
"에는 공백이나 개행 문자가 포함될 수 없습니다.
- 이전 페이지 DOM 노드 목록
- 다음 페이지 DOM 노드 정위치