پیمایش نقاط 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;
بازگشت 0;
</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[" آغاز، با "" پایان بخش CDATA را نشان می‌دهد. اجازه نمی‌شود بخش‌های CDATA درونی باشند." پایان:

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    else {
        return 0;
    }
}
" پایان بخش CDATA را نشان می‌دهد. اجازه نمی‌شود بخش‌های CDATA درونی باشند.
بازگشت 0;

}

</script>

در مثال بالا، تحلیل‌کننده تمام محتوای بخش CDATA را نادیده می‌گیرد." پایان بخش CDATA را نشان می‌دهد. اجازه نمی‌شود بخش‌های CDATA درونی باشند.درباره بخش‌های CDATA توجه داشته باشید:

بخش CDATA نمی‌تواند شامل رشته‌ای باشد "" پایان بخش CDATA را نشان می‌دهد. اجازه نمی‌شود بخش‌های CDATA درونی باشند.]]>