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

در این آموزش با ساخت XML مبتنی بر استریم آشنا می شویم. این روش نسبت به روش مبتنی بر DOM سریع تر و ساده تر است ،به علاوه نوشتن تگ ها و بستن آن ها در کد جاوایی با ساختار xml مطابقت بیشتری دارد. در این آموزش قصد داریم فایل 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.*;
   2: import javax.xml.stream.*;
   3: 
   4: public class XMLSaxWriter 
   5: {
   6:     public static void main(String[] args) throws Exception 
   7:     {
   8:         File myFile = new File("D:/sample.xml");
   9:         try (FileOutputStream fos = new FileOutputStream(myFile)) 
  10:         {
  11:             XMLOutputFactory xmlOFactory = XMLOutputFactory.newInstance();
  12:             XMLStreamWriter xmlSWriter = xmlOFactory.createXMLStreamWriter(fos, "UTF-8");
  13: 
  14:             xmlSWriter.writeStartDocument("UTF-8", "1.0");
  15: 
  16:                 xmlSWriter.writeStartElement("Persons");
  17:                     xmlSWriter.writeStartElement("Person");
  18:                     xmlSWriter.writeAttribute("name", "John Smith");
  19: 
  20:                         xmlSWriter.writeStartElement("Age");
  21:                         xmlSWriter.writeCharacters("30");
  22:                         xmlSWriter.writeEndElement();
  23: 
  24:                         xmlSWriter.writeStartElement("Gender");
  25:                         xmlSWriter.writeCharacters("Male");
  26:                         xmlSWriter.writeEndElement();
  27: 
  28:                     xmlSWriter.writeEndElement();
  29:                 xmlSWriter.writeEndElement();
  30: 
  31:             xmlSWriter.writeEndDocument();
  32: 
  33:             xmlSWriter.flush();
  34:             xmlSWriter.close();
  35:         }
  36:     }
  37: }

در ادامه با بخش های مختلف کد بالا آشنا می شویم. ابتدا ابزار های مورد نیاز را import می کنیم، در این روش به ابزار های زیادی نیاز نداریم(خطوط 2-1). با استفاده از خط 8 فایلی که قصد نوشتن در آن را داریم مشخص می کنیم. برای نوشتن با این روش نیاز به یک استریم خواهیم داشت، چون قصد ما نوشتن در فایل باید از FileOutputStream استفاده کنیم، برای همین در خط 9 fos را تعریف کرده ایم. با استفاده از خطوط 11 و 12 یک XMLStreamWriter ایجاد می کنیم که همانطور که از نام آن پیداست محتوای XML را بر روی یک استریم خروجی می نویسد. با استفاده از متد ()writeStartDocument ابتدای فایل XML را مشخص می کنیم، متناظر با این متد در انتهای کار باید متد ()writeEndDocument را فراخوانی کنیم تا مطمئن شویم فایل به درستی بسته می شود(خط 31). برای نوشتن یک تگ آغازین از متد ()writeStartElement استفاده می کنیم(16). به عنوان مثال خط زیر تگ آغازین <Person> را ایجاد می کند. در هر زمان که نیاز به بستن یک تگ داشتیم از متد ()writeEndElement استفاده می کنیم و تگ مورد نظر بسته می شود. پس از باز کردن یک تگ با استفاده از متد ()writeAttribute به سادگی می توانیم به تگ مورد نظر صفت جدید اضافه کنیم، پارامتر اول نام صفت و پارامتر دوم مقدار صفت است. به عنوان مثال در خط 18 صفت name را با مقدار John Smith به تگ Person اضافه کرده ایم. برای نوشتن مقدار متنی داخل یک تگ به سادگی از متد ()writeCharacters استفاده می کنیم، به عنوان مثال در خط 21 و 25 مقادیر 30 و Male را در بخش متن تگ های Age و Gender نوشته ایم. در انتها برای اینکه مطمئن شویم استریم خروجی در فایل نوشته شده است متد ()flush را فراخوانی می کنیم و سپس استریم های مربوطه را با فراخوانی متد ()close می بندیم.