خواندن فایل های XML با DOM Parser

در این آموزش با خواندن فایل های XML با روش مبتنی بر DOM آشنا می شویم. قبل از هر کار یک فایل xml جدید به نام sample.xml در درایو D ایجاد می کنیم و محتوای زیر را در آن می نویسیم :

<?xml version="1.0" encoding="utf-8" ?>
<Persons>
  <Person name="John Smith">
    <Age>30</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Mike Folley">
    <Age>25</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Lisa Carter">
    <Age>22</Age>
    <Gender>Female</Gender>
  </Person>
  <Person name="Jerry Frost">
    <Age>27</Age>
    <Gender>Male</Gender>
  </Person>
  <Person name="Adam Wong">
    <Age>35</Age>
    <Gender>Male</Gender>
  </Person>
</Persons>

این فایل یک فایل xml ساده است که تگ ریشه آن Persons است. در داخل این تگ یک تگ Person و در داخل این تک نیز دو تگ Age و Gender قرار دارند.
با استفاده از کد زیر محتوای این فایل را می خوانیم و خروجی مناسب را برای آن ایجاد می کنیم :

   1: import java.io.*;
   2: import org.w3c.dom.*;
   3: import javax.xml.parsers.*;
   4: 
   5: public class XMLDomRead 
   6: {
   7:     static void printNode(Node n) 
   8:     {
   9:         System.out.println("-----------------------");
  10:         Element e = (Element)n;
  11: 
  12:         // Name
  13:         System.out.println(n.getNodeName() + " name=" + e.getAttribute("name"));
  14:         // Age
  15:         String lastName = e.getElementsByTagName(n.getNodeName() + " Age").item(0).getTextContent();
  16:         System.out.println(n.getNodeName() + " Age: " + lastName);
  17:         // Gender
  18:         String address = e.getElementsByTagName("Gender").item(0).getTextContent();
  19:         System.out.println("Gender: " + address);
  20:     }
  21:     public static void main(String[] args) throws Exception 
  22:     {
  23:         File myXMLFile = new File("D:/sample.xml");
  24:         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
  25: 
  26:         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
  27: 
  28:         Document doc = dBuilder.parse(myXMLFile);
  29: 
  30:         String rootName = doc.getDocumentElement().getNodeName();
  31: 
  32:         System.out.println(rootName);
  33: 
  34:         NodeList list = doc.getElementsByTagName("Person");
  35:         int listSize = list.getLength();
  36:         System.out.println(listSize);
  37: 
  38:         for (int i = 0;i < listSize; i++) 
  39:         {
  40:             Node nodeI = list.item(i);
  41:             printNode(nodeI);
  42:         }
  43:     }
  44: }
Persons
5
-----------------------
Person name: John Smith
Person Age: 30
Person Gender: Male
-----------------------
Person name: Mike Folley
Person Age: 25
Person Gender: Male
-----------------------
Person name: Lisa Carter
Person Age: 22
Person Gender: Female
-----------------------
Person name: Jerry Frost
Person Age: 27
Person Gender: Male
-----------------------
Person name: Adam Wong
Person Age: 35
Person Gender: Male

در ادامه با بخش بخش کد بالا آشنا می شویم. قبل از هر کار باید ابزار های مورد نیاز برای کار با xml، تجزیه گر مبتنی بر dom و کتابخانه io را import کنیم(خطوط 3-1). در داخل تابع main که نقطه شروع برنامه است یک شی از کلاس فایل ایجاد می کنیم و به فایلی که قصد خواندن از آن را داریم اشاره می کنیم(خط 23). در خطوط 28-24 یک Document ایجاد می کنیم که همان درخت تجزیه مورد نظر ماست. دقت کنید که شی myXMLFile پارامتر ورودی متد parse است. در خط 30 گره ریشه (root) را به دست می آوریم. متد ()getDocumentElement به گره Person دسترسی پیدا می کند، با استفاده از متد ()getNodeName نام آن (یعنی عبارت “Person”) استخراج می شود. سپس در خط 34 لیست تمام گره هایی که از نوع Person هستند را به دست می آوریم.
متد ()getElementsByTagName لیستی از تمام تگ ها را بر اساس نامی که به آن ارسال می کنیم ب صورت یک لیست به ما می دهد. کلاس NodeList یک لیست برای نگه داری Node هاست. با استفاده از متد ()getLength می توانیم اندازه این لیست را به دست بیاوریم، خطوط 36-35 تعداد تگ های Person را چاپ می کند. با استفاده از یک حلقه for می توانیم به آیتم های داخل list دسترسی پیدا می کنیم و آن را در یک شی از کلاس Node نگه داری کنیم(خطوط 42-38). خط 40 هر آیتم از list را در یک شی از نوع Node ریخته و سپس در خط 41 متد ()printNode را بر روی آن فراخوانی می کنیم. متد ()printNode متدی است که خودمان آن را نوشته ایم(20-7)، در داخل این متد ابتد یک خط به عنوان جدا کننده چاپ می کنیم و سپس شی از نوع Node را به شی ای از نوع Element تبدیل می کنیم(خطوط 10-9). می دانیم که تگ Person در فایل مورد نظر دارای صفتی به نام name است، با استفاده از متد ()getAttribute می توانیم به این صفت دسترسی داشته باشیم. خط 13 نام Element و مقدار name آن را چاپ می کند. با استفاده از متد ()getElementsByTagName می توانیم تمام تگ های داخلی را بر اساس نامشان لیست کنیم. با استفاده از متد ()item می توانیم مشخص کنیم که قصد داریم به کدام مورد دسترسی پیدا کنیم (اندیس صفر اولین گره ، اندیس یک دومین گره و …). پس از دسترسی به یک گره با استفاده از متد ()getTextContent می توانیم محتوای متنی داخل گره را چاپ کنیم.