Java API for XML Processing
- 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
مهندسی نرم افزار کامپیوتر