ساخت XML با روش مبتنی بر DOM

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

<?xml version="1.0" encoding="utf-8" ?>
<Persons>
  <Person name="John Smith">
    <Age>30</Age>
    <Gender>Male</Gender>
  </Person>  
</Persons>

با استفاده از کد زیر می توانیم این ساختار را در فایلی به نام sample.xml ایجاد کنیم :

   1: import java.io.File;
   2: import javax.xml.parsers.*;
   3: import javax.xml.transform.*;
   4: import javax.xml.transform.dom.DOMSource;
   5: import javax.xml.transform.stream.StreamResult;
   6: import org.w3c.dom.*;
   7: 
   8: public class XMLDomWrite 
   9: {
  10:     public static void main(String[] args) throws TransformerException, ParserConfigurationException
  11:     {
  12:         File myFile = new File("D:/sample.xml");
  13: 
  14:         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
  15:         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
  16: 
  17:         Document doc = dBuilder.newDocument();
  18: 
  19:         //Persons Root
  20:         Element Persons = doc.createElement("Persons");
  21:         doc.appendChild(Persons);
  22: 
  23:         //Person Node
  24:         Element Person = doc.createElement("Person");
  25:         Persons.appendChild(Person);
  26: 
  27:         //Set attribue for Person
  28:         Attr attr = doc.createAttribute("name");
  29:         attr.setValue("John Smith");
  30:         Person.setAttributeNode(attr);
  31: 
  32:         // Age Node
  33:         Element Age = doc.createElement("Age");
  34:         Age.appendChild(doc.createTextNode("30"));
  35:         Person.appendChild(Age);
  36: 
  37:         //Gender Node
  38:         Element Gender = doc.createElement("Gender");
  39:         Gender.appendChild(doc.createTextNode("Male"));
  40:         Person.appendChild(Gender);
  41: 
  42:         //write to file
  43:         TransformerFactory tFactory = TransformerFactory.newInstance();
  44:         Transformer transformer = tFactory.newTransformer();
  45: 
  46:         DOMSource source = new DOMSource(doc);
  47:         StreamResult result = new StreamResult(myFile);
  48: 
  49:         //transform
  50:         transformer.transform(source, result);
  51:     }
  52: }

در ادامه با بخش های مختلف کد بالا آشنا می شویم. ابتدا ابزار های مورد نیاز را import می کنیم(خطوط 6-1). سپس در خط 12 فایلی که قصد نوشتن در آن را داریم مشخص می کنیم.در خط 14 یک Document خالی ایجاد می کنیم. با استفاده از متد ()createElement یک المان جدید به نام Persons ایجاد می کنیم و با استفاده از متد ()appendChild آن را به doc اضافه می کنیم، چون doc خالی است المان جدید همان گره ریشه خواهد بود(خطوط 21-20). در ادامه گره دیگری به نام Person ایجاد می کنیم، می دانیم که گره Person باید زیر گره، گره Persons باشد لذا این بار متد ()appendChild را بر روی شی Persons فراخوانی می کنیم(خط 25). حال نوبت به ایجاد زیر گره های Person یعنی Age و Gender می رسد. همانطور که مشاهده می کنید خطوط 35-33 و 40-38 شبیه هم هستند. ابتدا با استفاده از متد ()createTextNode یک مقدار متنی بین این دو تگ ایجاد می کنیم و سپس با فراخوانی متد ()appendChild را بر روی شی Person، آنها را به صورت زیر گره این گره در می آوریم. اگر برنامه را اجرا کرده و به درایو D بروید مشاده می کنید که یک فایل XML به صورت ابتدای درس ایجاد شده است.تنها کاری که باقی مانده است ذخیره ساختار فوق در یک فایل است. برای این کار از کلاس Transformer استفاده می کنیم ، از روی doc یک شی از کلاس DOMSource ایجاد می کنیم و از روی فایلی که قصد نوشتن در آن را داریم نیز شی ای از کلاس StreamReslut ایجاد می کنیم.
اشیای source و result را به متد transform ارسال می کنیم و کار تمام می شود. حال اگر مثلا زیر گره Age دارای خاصیتی به نام age و مقدار Young باشد، کدهای 35-33 را پاک کرده و کدهای زیر را جایگزین نمایید :

Element Age =doc.createElement("Age");
Attr attr1=doc.createAttribute("age");
attr1.setValue("Young");
Age.setAttributeNode(attr1);
Age.appendChild(doc.createTextNode("30"));
Person.appendChild(Age);

همانطور که در کد بالا مشاهده می کنید، با استفاده از متد ()createAttribute خاصیت را ایجاد کرده، با استفاده از متد ()setValue یک مقدار به آن اختصاص داده و در نهایت با استفاده از متد ()setAttributeNode آن را به گره مورد نظر اختصاص می دهیم. حال دوباره برنامه را اجرا و نتیجه را مشاهده کنید.