- XML

1-1- مقدمه

XML[1] يك استاندارد بين المللي است برا ي توصيف و ساختاردهي به اطلاعات مستقل از برنامه كاربردي. XML قابل گسترش[2] است يعني مي­توان زبان­هاي نامحدودي را توسط آن براي برنامه­هاي كاربردي و استفاده­هاي خاص تعريف كرد.[4]

XML به استاندارد نمايش داده در اينترنت تبديل شده است. داده هاي XML توسط هر پلاتفرمي چه كوچك و چه بزرگ پشتيباني مي شوند. XML براي برنامه هاي جاوا يك گزينه مناسب براي نمايش داده مي باشند زيرا برنامه هاي مستقل از پلاتفرم جاوا نياز به داده هاي مستقل از پلاتفرم دارند و XML اين خاصيت را دارد.[4]

اكثر پارسرهاي XML به زبان جاوا نوشته شده اند و در اين زبان مجموعه كاملي از API[3]هاي مختلف كه مختص كار با XML هستند وجود دارد.[3]

XML يك Metalanguage است كه براي تعريف اسناد داراي داده هاي ساخت يافته بكار مي رود.

خواص و مزاياي XML را مي توان در زمينه هاي زير دسته بندي كرد.

-        Extensibility: XML به عنوان يك Metalanguage مي تواند براي بوجود آوردن يك زبان نشانه گذاري جديد بكار رود.

-        ساختار دقيق: XML بر خلاف HTML داراي ساختار دقيق است و مي تواند به صورت كارامدي پردازش شود. هر سند XML داراي يك ريشه[4] است و ساير Elementها در داخل يكديگر و به صورت تو در تو قرار دارند.

دو نوع سند XML وجود دارد:

-        سند Valid: كه توسط يك [5]DTD كه گرامر آن را مشخص مي كند تعريف مي شود.

-        سند Well-Formed: كه DTD براي آن تعريف نمي شود ولي بايد دو قانون در آن رعايت شود. اول اينكه هر Element بايد يك tag آغازي و يك tag پاياني داشته باشد و دوم اينكه تنها يك عنصر ريشه بايد موجود باشد كه ساير element ها را در بر گرفته است.[4]

1-2- XML توسط چه كساني بوجود آمده است

XML توسط W3C[6] بوجود آمده و در سال 1996 تلاش براي توسعه آن آغاز شده است. در سال 1998 مشخصه XML 1.0 توسط W3C اعلام شد.

 

1-3- رابطه XML و تكنولوژي جاوا چيست

XML و تكنولوژي جاوا مكمل يكديگر هستند. تكنولوژي جاوا كدي قابل حمل و قابل نگهداري را براي پردازش داده­هاي قابل حمل XML فراهم مي­كند. به علاوه، XML و تكنولوژي جاوا ويژگي­هاي مشتركي با هم دارند كه آنها را براي Web Computing ايده­آل كرده است از جمله اينكه هر دو يك استاندارد صنعتي هستند، همچنين مستقل از پلاتفرم، قابل گسترش، قابل استفاده مجدد، Web-centric و بين­المللي مي­باشند.

در بخش­هاي مختلف تكنولوژي جاوا از XML استفاده شده است از جمله:

-        Java API for XML-Based Web Services (JAX-WS)

-        Java API for XML Processing (JAXP)

-        Java Architecture for XML Binding (JAXB)

-        Java API for XML Messaging (JAXM)

-        Java API for XML Registries (JAXR)

-        Java API for XML-Based RPC (JAX-RPC)

-        Java 2 Platform, Enterprise Edition (J2EE)

موضوع اين گزارش در مورد JAXP است.[1]

 

2- JAXP[7]

Java API for XML Processing برنامه­هاي كاربردي را قادر مي­سازد كه اسناد XML را مستقل از پياده­سازي خاص يك XML Processor پارس و Transform كنند. همچنين JAXP اين خاصيت را دارد كه برنامه­هاي كاربردي را قادر مي­سازد كه به سادگي بين پياده­سازي­هاي مختلف XML Processorها Switch كنند.

JAXP شامل استانداردهاي صنعتي مي­باشد از جمله: SAX[8]، DOM[9]، XPath، XSLT[10] و...

پكيج javax.xml در JDK[11] كه ابزارهاي كار كردن با تكنولوژي­هاي XML در آن موجود است شامل اجزاي زير مي­باشد:

شكل 1: محتويات پكيج java.xml

در ادامه اطلاعات مختصري راجع به پكيج­هاي مورد نظر اين متن آمده است.

 

javax.xml.parsers:

شكل 2: محتويات پكيج java.xml.parsers

اين پكيج شامل چهار كلاس abstract و دو كلاس exception است. دو كلاس DocumentBuilder و DocumentBuilderFactory براي ايجاد يك پارسر DOM و استفاده از آن بكار مي­رود. دو كلاس SAXParser و SAXParserFactory براي ايجاد پارسرهاي SAX استفاده مي­شود.

 

 

 

 

javax.xml.transform:

شكل 3: محتويات پكيج java.xml.transform

اين پكيج داراي امكانات لازم براي كار با XSLT است و از مبدل­هاي مختص DOM و SAX هم پشتيباني مي­كند.

كلاس­هاي پايه­اي براي transform مانند Transformer و TransformerFactory در اين پكيج مي­باشد.

 

javax.xml.validation:

شكل 4: محتويات پكيج java.xml.validation

اين پكيج يك API را براي validate كردن يك سند XML بوسيله XML Schema فراهم مي­كند.

 

 

 

 

 

 

 

javax.xml.xpath:

شكل 5: محتويات پكيج java.xml.xpath

اين پكيج امكانات لازم براي ارزيابي عبارات XPath را فراهم مي­كند.

از اطلاعات داده شده در اين بخش در مورد پكيج­هاي JAXP در ادامه متن استفاده خواهد شد.

در ادامه به بررسي استانداردهاي صنعتي XML نظير SAX، DOM، XPath و XSLT مي­پردازيم.[3]

 

3- پارس كردن يك سند XML

به طور كلي دو شيوه براي پارس كردن يك فايل XML وجود دارد.

-        Stream Model

-        Data Model

SAX از شيوه Stream Model استفاده مي كند و DOM از شيوه Data Model.

در ادامه اين دو شيوه پارس كردن به تفصيل توضيح داده شده است.

 

4- SAX

SAX كه مخفف Simple API for XML، يك پارسر نيست و يك Interface استاندارد است كه توسط پارسرهاي مختلف XML پياده­سازي شده است. اين API شامل چندين واسط است از جمله:

-        Attributes

-        ContentHandler

-        DTDHandler

-        EntityResolver

-        ErrorHandler

-        …

SAX از شيوه Stream Model براي پارس استفاده مي­كند به اين معني كه سند XML توسط اين پارسر به جرياني از element تبديل مي­شود و نمي­توان در سند XML به عقب بازگشت و يا آن را تغيير داد. همچنين سند XML يك بار توسط پارسر مرور مي­شود و نمايشي درختي از اين سند توسط پارسر بوجود نمي­آيد. به همين خاطر SAX بسيار كارامد است. ولي براي انجام كارهاي پيشرفته روي سند گزينه مناسبي نيست چون نياز به طراحي و ايجاد يك نمايش زمان اجرا توسط developer مي­باشد كه اين كار بسيار وقتگير و error-prone است.

مهمترين مزيت SAX اين است كه Lightweight و سريع است. اين خاصيت بيشتر به اين خاطر است كه SAX يك event-based API است به اين معني كه رويدادهاي parsing مانند رويداد ابتداي element و پايان element را مستقيما به برنامه كاربردي گزارش مي­كند. به شكل 6 توجه كنيد:

 

شكل 6: نحوه كار SAX

 

براي دريافت رويدادهاي مختلف parsing از پارسر XML از واسط­هاي مختلف استفاده مي­شود. مثلا بوسيله واسط ContentHandler مي­توان رويدادهايي نظير:

-        startDocument

-        endDocument

-        startElement

-        endElement

-        characters

-        ..

را Handle كرد. وقتي پارسر به ابتداي يك element در سند XML مي­رسد، رويداد startElement اتفاق مي­افتد و به همين ترتيب ساير رويدادها نيز در زمان مناسب فراخواني مي­شوند.

يك مثال اين موضوع را روشن­تر مي­كند. سند XML شكل 7  براي ذخيره­سازي يك دفترچه تلفن ساده بكار مي­رود.

 

شكل 7: يك سند XML براي ذخيره سازي يك دفترچه تلفن ساده

وقتي بوسيله يك پارسر SAX آن را پارس مي­كنيم رويدادهاي زير به ترتيب اتفاق مي­افتد.

-        startDocument به اين معني كه پارسر به نقطه محتواي سند رسيده است.

-        startElement كه ابتداي عنصر phone-book را نشان مي­دهد.

-        startElement كه ابتداي عنصر contact را نشان مي­دهد.

-        startElement كه ابتداي عنصر first-name را نشان مي­دهد.

-        characters كه رشته "Ali" را نشان مي­دهد.

-        endElement كه پايان عنصر first-name را نشان مي­دهد.

-        ...

مشخصات يك رويداد مانند نام عنصر، attributeها و ... توسط پارامترها به event-handlerها ارسال مي­شود.

 

استفاده از SAX در جاوا بسيار ساده است. به تكه كد زير توجه كنيد.

ابتدا بايد يك Handler به شيوه شكل 8 براي پردازش رويدادهاي پارسر بنويسيم:

 

شكل 8: نوشتن يك كلاس handler براي پاسخگويي به رويدادهاي پارسر SAX

 

سپس كدي كه با استفاده از SAX يك سند XML به نام test.xml را پردازش مي­كند را مانند شكل 9 مي­نويسيم.

شكل 9: كد نمونه براي پارس كردن يك سند XML توسط SAX

 

خط پنجم از كد شكل 9 كه بوسيله يك فلش نشان داده شده است مي­گويد كه پارسر سند را validate مي­كند به اين معني كه syntax سند را از روي يك DTD چك مي­كند و در صورت بروز error، آن را از طريق error-handler معرفي شده به پارسر به اطلاع برنامه­كاربردي مي­رساند.

پياده­سازي­هاي مختلفي از SAX موجود است. از جمله معروف­ترين آنها مي­توان به موارد زير اشاره كرد:

-        Xerces2 (Apache distribution)

-        Xerces2 (SUN JDK 5.0 distribution)

-        Ælfred parser

-        Ælfred parser (Saxon distribution)

-        Apache Crimson parser (in JDK 1.4)

-        Oracle XML Parser

-        Piccolo XML Parser

-        James Clark's XP

 

4-1 مزايا و معايب SAX

همانطور كه گفته شد SAX يك پارسر Lightweight و سريع است و از stream model پيروي مي­كند. به اين معني كه اين پارسر كل سند را به داخل حافظه وارد نمي­كند و هيچ درختي از سند در حافظه بوجود نمي­آورد و اين موضوع باعث افزايش سرعت مي­شود.در ضمن SAX داراي امكانات دسترسي random به سند نمي­باشد. ولي داشتن يك نماي كلي از يك سند XML مي­تواند درك سند را راحتتر كند. به خاطر همين موضوع SAX براي كارهاي ابتدايي با سند XML بسيار مناسب است.

نكته ديگر اين است كه SAX در هنگام رسيدن به ابتداي يك عنصر بدون توجه به نوع آن يك رويداد اتفاق مي­افتد و اين موضوع باعث مي­شود كه در ابتداي handler هاي مختلف نوشته شده بوسيله يك برنامه­نويس نياز به if-then-else نويسي زيادي باشد.

مشكل ديگر SAX اين است كه برنامه­نويس بايستي در هنگام ديده شدن يك عنصر بايستي يك flag كه قابل دسترسي توسط همه handlerها و به اصطلاح global است را set كند تا در متد characters كه محتويات يك عنصر قابل دسترسي است مشخص شود كه اين محتويات متعلق به يك عنصر است. اين flag بايد در رويداد انتهاي عنصر unset شود.[1]

 

5- DOM

Document Object Model يك interface ناوابسته به زبان و پلاتفرم است براي دسترسي و به روز رساني اسناد XML. برخلاف SAX،  DOM از طريق يك ساختار درختي كه از گره­هاي element و گره­هاي text تشكيل شده است به اسناد XML دسترسي پيدا مي­كند. به شكل 10 توجه كنيد.

شكل 10: نحوه كار DOM

اين درخت در حافظه بوجود مي­آيد و بنابراين در هنگام استفاده از DOM نياز به مقدار زيادي حافظه است. مزيت DOM اين است كه برنامه­نويسي بوسيله آن بسيار ساده­تر و آسان­تر از SAX است. درخت DOM تنها با استفاده از چند خط كد برنامه بوجود مي­آيد و وقتي بوجود آمد مي­توان آن را در هر جهت traverse كرد.

پياده­سازي DOM معمولا بر روي SAX صورت مي­پذيرد به اين معني كه پارسر DOM از SAX براي ساختن درخت XML استفاده مي­كند و به همين دليل كندتر از SAX است.

در شكل 11 كد جاوا لازم براي پارس كردن يك فايل XML توسط DOM را مشاهده مي­كنيد.

شكل 11: كد نمونه براي پارس كردن يك سند XML توسط DOM

شيء كلاس Document نمايش زمان اجراي درخت سند XML را بر عهده دارد. مي­توان آن را در هر جهت traverse كرد، روي آن بوسيله XPath پرس­وجوهاي مختلف اجرا كرد، محتويات سند را تغيير داد و ...

در ادامه به معرفي XSLT و پس از آن به بررسي XPath مي­پردازيم.[2]

 

6- XSLT

Extensible Stylesheet Language Transformation براي تبديل اسناد XML به هر فرمت دلخواهي مانند HTML، WML، XHTML و ... بكار مي­رود..يك موتور يا پردازنده مبدل، يك سند XML را به عنوان ورودي مي­گيرد و بوسيله يك XSL آن را به يك سند جديد همان­طور كه در شكل 12 مي­بينيد تبديل مي­كند.

شكل 12: نحوه كار XSLT

XSL از سه بخش تشكيل شده است:

-        XSLT كه يك زبان براي تبديل اسناد XML است.

-        XPath كه يك زبان براي navigate كردن در سند XML است.

-        XSL-FO كه يك زبان براي formatting اسناد XML است.

XSLT همان­طور كه گفته شد براي تبديل اسناد XML به فرمت­هاي ديگر بكار مي­رود. مثلا سند XML شكل 13 را در نظر بگيريد.

شكل 13: كد XML نمونه

اين سند XML در مرورگر IE به صورت شكل 14 به نمايش درمي­آيد:

شكل 14: نمايش كد XML شكل 13 در IE

ولي اين شيوه نمايش براي كاربر زياد مفيد نيست. كاربر مايل است كه داده ها به شيوه اي براي او به نمايش درآيد كه به سادگي قابل خواندن و فهم باشد. مي­توان با استفاده از XSL اين سند را به سندي با ظاهر بهتر تبديل كرد.

اگر از سند XSL شكل 15 كه در فايلي به نام test.xsl در پوشه جاري ذخيره شده است استفاده كنيم:

شكل 15: XSL نوشته شده براي تبديل سند XML شكل 13 به يك سند HTML

و كد شكل 16 را به ابتداي فايل XML ورودي اضافه كنيم:

شكل 16: نحوه اطلاع به مرورگر براي استفاده از مبدل test.xsl جهت نمايش يك سند XML

اين خط به مرورگر مي­گويد كه برا ي نمايش اين سند XML از فايل test.xsl استفاده كند.

آنگاه وقتي سند XML را در مرورگر IE باز مي­كنيم، سند به صورت شكل 15 نمايش داده مي­شود:

شكل 17: ظاهر سند XML تبديل شده توسط مبدل شكل 15

در سند XSL از XPath براي دسترسي به اجزاي سند XML استفاده مي­شود. مثلا در عنصر value-of در شكل بالا عبارتي كه در قسمت select نوشته مي­شود يا در عنصر template عبارتي كه در قسمت match نوشته مي­شود به زبان XPath است.

 

در زير ليست بعضي از elementهاي XSL را مي­بينيد.

-       

-       

-       

-       

-       

-       

-       

-        …

6-1 XSLT در Java

اگر نام فايل ورودي text.xml و نام فايل مبدل test.xsl باشد، تكه كد شكل 18 تبديل شده فايل ورودي را در فايلي به نام out.html ذخيره مي­كند.

شكل 18: نحوه استفاده از XSLT در جاوا

كد html توليد شده  توسط مبدل در شكل 19 نشان داده شده است:

شكل 19: كد HTML توليد شده توسط مبدل

و وقتي اين فايل را در يك مرورگر باز كنيم به صورت شكل 20 به نمايش درمي­آيد.[4]

شكل 20: ظاهر سند HTML شكل 19

7- XPath

XPath يك زبان براي جستجوي اطلاعات در يك سند XML است. XPath يك عنصر بنيادي استاندارد XSL است كه XSLT، XQuery، XPointer و ... بر پايه عبارات XPath ساخته شده­اند.

استفاده از XPath در جاوا:

شكل 21: نحوه استفاده از XPath در جاوا

در تكه كد شكل 21 استفاده از XPath را در جاوا مشاهده مي­كنيد كه در اينجا روي يك Stream عبارت XPath استفاده شده است. مي­توان عبارت XPath را روي ساختارهاي پيچيده­تر مانند درخت DOM نيز بكار برد به صورت شكل 22:

شكل 22: نحوه استفاده از عبارات XPath روي يك درخت DOM

در بالا ابتدا روي يك فايل XML كه همان source مي­باشد يك عبارت XPath اجرا شد نتيجه آن كه يك درخت DOM است در متغير n ذخيره شد و سپس در خط دوم روي همين درخت DOM يك عبارت XPath ديگر ارزيابي شد و نتيجه آن در يك درخت DOM ديگر به نام list قرار گرفت.[4]


فهرست منابع

[1] Brett McLaughlin, All about JAXP, November 2000

[2] Jason Hunter and Brett McLaughlin, JDOM, April 26, 2000

[3] Jeff Hunter, XML – Application Programming Interfaces, 2002

[4] Qusay H. Mahmoud, JSP with XML in mind, July 2001



[1] Extensible Markup Language

[2] Extensible

[3] Application Program Interface

[4] root

[5] Document type Definition

[6] World Wide Web Consortium

[7] Java API for XML Processing

[8] Simple API for XML

[9] Document Object Model

[10] XSL Transformations

[11] Java Development Kit