در این قسمت می خواهیم درباره ی پیمایش درخت Xml صحبت کنیم.اگر اموزش xml را مطالعه کرده باشید می  دانید که  تمام node ها مثل شاخه و برگ ها و ریشه های درخت اند

حالا برای دسترسی به node ها ما ویژگیهای زیر را داریم :

parentNode
childNodes
firstChild
lastChild
nextSibling
previousSibling

بار دیگر فایل books.xml را باز کنیدو به ان توجه نمائید
خط اول:

اتصال به فایل books.xml

خط دوم :

پیدا کردن اولین تگ book

خط سوم :

نام node ای که والد این book است را نمایش می دهد

xmlDoc=loadXMLDoc(“books.xml”);

x=xmlDoc.getElementsByTagName(“book”)[0];

document.write(x.parentNode.nodeName);

اجتناب از node های متنی خالی

فایر فاکس و برخی از مرورگرهای دیگر ، با جای خالی و کاراکتر خط بعد( که البته ما نمی بینیم اما وجود دارد ) بعنوان node های متنی برخورد می کنند

در حالیکه ie این برخورد را ندارد

و همین خصلت مرورگرهای غیر از IE باعث بروز اشکالاتی در زمان استفاده از ویژگیهای زیر می شود :

firstChild, lastChild, nextSibling, previousSibling

برای اینکه مرورگرها با جای خالی و کاراکتر خط بعد ( البته منظور از جای خالی و کاراکتر خط بعد ی است که بین تگ ها قرار دارد یعنی بعد از تگ بسته یک NODE و تگ باز NODE بعدی )

ما باید دستوراتی بنویسیم که این NODE های بدرد نخور را تشخیص دهد

برای این منظور تابعی به نام دلخواه get_nextSibling تعریف می کنیم

این تابع نام node مورد نظر را بعنوان پارامتر دریافت می کند ( در ادامه یک برنامه کامل برای کاربرد تابعی مشابه تابع  زیر خواهیم اورد )

function get_nextSibling(n)
{
y=n.nextSibling;
while (y.nodeType!=1)
{
y=y.nextSibling;
}
return y;
}

nodeType نوع NODE را مشخص می کند

اگر NODE ای در حال پیمایش است از نوع ELEMENT باشد ، مقدار NODETYPE ان یک خواهد شد

پس حلقه ای نوشتیم که تا زمانیکه node ای که به ان رسیده ایم element ( تگ ) نیست برو به node بعدی با نوشتن این حلقه ، نتیجه برنامه در تمام مرورگرهای IE و سایر مرورگرها یکسان خواهد شد بدست اوردن اولین فرزند یک ELEMENT کد زیر اولین فرزند اولین تگ book را بدست می اورد

 

<html>
<head>
<script src=”loadxmldoc.js”>
</script>
<script>
//check if the first node is an element node

function get_firstChild(n)
{

y=n.firstChild;
while (y.nodeType!=1)
{
y=y.nextSibling;
}
return y;

}

</script>
</head>

<body>
<script>
xmlDoc=loadXMLDoc(“books.xml”);

x=get_firstChild(xmlDoc.getElementsByTagName(“book”)[0]);

document.write(x.nodeName);

</script>
</body>
</html>

y=n.firstChild;

اشاره گری به نام y به  اولین فرزند  node ای گه نام ان در پارامتر n قرار گرفته ایجاد می شود

این اولین فرزند ممکن است کاراکتر خط بعدی باشد چرا که ممکن است برنامه نویس بعد از علامت بزرگتری  تگ book  اینتر زده تا به خط بعد برود و تگ فرزند انرا تعریف کند

گفتیم مرورگرهایی مثل فایر فاکس با این کاراکتر خط بعد مثل یک node رفتار می کنند و فکر می کنند این کاراکتر هم یک فرزند book است برای جای خالی هم همین طور

حالا ما باید بررسی کنیم اگر این node برابر یک نیست که برود به node بعدی که با ان خواهر برادر است شما می دانید که تمام node های موجود در تگ book فرزندان book هستند و این فرزندان با هم خواهر برادرند

while (y.nodeType!=1)

یعنی اگر node پیدا شده یک نبود یعنی تگ نیست

y=y.nextSibling;

برو به node بعدی ای که خواهر برادر node فعلی است که y دارد به ان اشاره می کند

return y;

در نهایت به اولین node ای که از نوع یک بود رسید از حلقه خارج می شود و اشاره گر به ان را که همان Y است به محل فراخوانی تابع برمی گرداند

x=get_firstChild(xmlDoc.getElementsByTagName(“book”)[0]);

اشاره گر برگشت داده شده از تابع در x قرار می گیرد

document.write(x.nodeName);

نام node ای که X به ان اشاره می کند ( یعنی همان اولین  node فرزند book که پیدا شده ) در خروجی نمایش داده می شود
مشاهده و اجرای برنامه کامل

چند نکته :

تابع جاوا اسکریپتی lastchild :

اخرین فرزند node مورد نظر را می دهد

تابع جاوا اسکریپتی firstchild:

اولین فرزند node مورد نظر را می دهد
تابع جاوا اسکریپتی nextsibling :

خواهر برادر بعدی node مورد نظر را می دهد

تابع جاوا اسکریپتی previousSibling:

خواهر برادر قبلی node مورد نظر را می دهد