מדריך PHP

מדריך PHP: JSON ו-XML

‏ • Internet Israel

אנחנו לא חיים במציאות שבה האתר שלנו יושב לבד ולא מעט פעמים אנו צריכים לתקשר עם webservices ושירותים שונים. בין אם אנו מספקים את המידע ובין אם אנו קולטים את המידע. ישנם מספר פורמטים שבהם אנו משתמשים כדי לתקשר עם אתרים או עם ווידג'טים. שני פורמטים פופולריים הם JSON ו-XML.

JSON

JSON (מבטאים כג'ייסון, כמו הרוצח ביום שישי ה-13) הוא ראשי תיבות של JavaScript Object Notation. מדובר בפורמט קל ופשוט שמשתמשים בו ב-JavaScript אבל לא רק. הפורמט הוא פורמט קל משקל ונוח לקריאה ואני מניח שיש לכם ידע מספיק ב-JavaScript על מנת להכיר אותו ולעבוד איתו. ב-PHP יש לנו כמה פונקציות שעוזרות לנו לקחת אובייקטים של PHP ולהמיר אותם לאובייקטים של JSON ולהיפך. זה שימושי במיוחד כאשר אנו משתמשים ב-AJAX, כיוון שבמדריך זה אני לא מלמד AJAX, אנו נדגים את השימוש באמצעות שני קבצים. אחד הוא קובץ HTML הכולל JavaScript ששולח JSON באופן פשוט – ללא AJAX. ה-JSON נשלח לדף PHP בשם form.php

הנה קובץ ה-HTML:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <script src="json2.js"></script>
        <script>
            var myJsonObject = {
                "title" : "myJsonObject",
                "value" : "This is my value"
            };
            function sendJSON() {
                var myJsonObjectString =  JSON.stringify(myJsonObject);
                window.location = 'jsonparse.php?jparam='+ myJsonObjectString;
            }           
        </script>
        <title>Test page for sending JSON objects</title>
        
    </head>
    <body>
        <button onclick="sendJSON()" type="button">Send JSON</button>
    </body>
</html>

כפי שאנו רואים מדובר בקובץ פשוט למדי המכיל כפתור שיש לו onclick, מה שהכפתור עושה הוא לשלוח באמצעות GET אובייקט JSON ל- jsonparse.php.

Form PHP מקבל את האובייקט, אבל כאשר הוא מקבל את האובייקט, הוא לא אובייקט אלא סתם מחרוזת טקסט. בואו וננסה להדפיס אותה באמצעות הקוד הבא:

<?php

print $_REQUEST['jparam'];

מה שאנו נקבל זו הדפסה של טקסט:

JSON print

מדובר בטקסט פשוט, אבל באמצעות פונקציות שמטפלות ב-JSON, אני יכול לקחת את המחרוזת הפשוטה הזו (שהיא בעצם ייצוג טקסטואלי של אובייקט JSON) ולהפוך אותה לאובייקט PHP. איך אני עושה את זה? באמצעות פונקצית json_decode! בואו ונדגים:

<?php

$jsonObject = json_decode($_REQUEST['jparam']);

print_r($jsonObject);

אם נסתכל על התוצאה:

print JSON object

אנו רואים שבעצם יש לנו אובייקט, אובייקט אמיתי שאפשר לשנות. לאחר שעשינו שינויים, אנו יכולים להפוך את האובייקט הזה (וכל אובייקט/מערך שנרצה) למחרוזת טקסט:

<?php

$jsonObject = json_decode($_REQUEST['jparam']);
$jsonObject->title = 'another subject';
$jsonObject = json_encode($jsonObject);

print_r($jsonObject);

את המחרוזת הזו ניתן לשלוח בקלות בחזרה ל-JavaScript באמצעות AJAX. לפיכך השימוש ב-JSON ככלי תקשורת בין JavaScript ל-PHP הוא כל כך פשוט.

XML

XML נחשב פורמט הרבה יותר בזבזני מ-JSON החסכוני. אך הוא נחשב כסטנדרט וחשוב לדעת אותו. רוב ה-web services משתמשים ב-XML על מנת לקיים תקשורת אחד עם השני. ב-PHP יש לנו parser מיוחד ל-XML שיכול ליצור XML או לקרוא אותו.

אני לא נכנס להסברים של 'מה זה XML' ואני מניח שרוב מי שקורא את המדריך הזה יודע מה זה XML ומעוניין רק בהסבר ראשוני על איך PHP עובד איתו.

ישנן לא מעט הרחבות שמטפלות ב-XML בשפת PHP, כולן מפורטות בדוקומנטציה. אני אתמקד בהרחבת simpleXML שכשמה כן היא – פשוטה ונעימה.

בואו וניצור XML ארביטרארי שנוכל להתאמן עליו ונשמור אותו. באמצעות ה-WebMatrix אנו יכולים ליצור קובץ XML ולאכלס אותו. נלחץ על הוספת קובץ חדש ואז על הוספת XML:

Create XML with WebMatrix

נכניס את ה-XML המאד פשוט הזה:

<?xml version="1.0" encoding="utf-8" ?>
<notes>
<note>
<to>Ran</to>
<from>Moshe</from>
<heading>Reminder</heading>
<body>Don't forget to send me some PHP lines!</body>
</note>
<note>
<to>Moshe</to>
<from>Ronen</from>
<heading>Alert</heading>
<body>Restart the server</body>
</note>
</notes>

קריאת ה-XML יכולה להיעשות בשתי דרכים – או באמצעות קריאה ישירה של הקובץ עם פונקצית simplexml_load_file או באמצעות קריאה של string שמכיל את ה-XML. אנו נתמקד כרגע בקריאה ישירה של הקובץ. אם אנו יודעים מה המבנה של הקובץ, הקריאה היא פשוטה מאד. בואו ונניח שאני רוצה לקרוא את to של ה-note השני, קודם אטען את הקובץ. אחרי הטעינה קובץ ה-XML זמין כמערך משולב באובייקטים:

<?php
$xml = simplexml_load_file('XMLFile.xml');

print $xml->note[1]->to;

כאן למשל אקבל תוצאה של Moshe

אני יכול לרוץ על ה-xml כמו כל אובייקט/מערך באמצעות foreach:

<?php
$xml = simplexml_load_file('XMLFile.xml');

foreach ($xml->note as $note) {
    print $note->from.' to : '.$note->to.'<br />';
}

יש גם תמיכה מובנית ב-xpath, אם אתם ממש רוצים להשתמש בזה:

<?php
$xml = simplexml_load_file('XMLFile.xml');

foreach ($xml->xpath('note') as $note) {
    print $note->from.' to : '.$note->to.'<br />';
}

מה שיפה הוא שאפשר לשנות את המערך הזה ולהמיר אותו חזרה ל-XML כאשר כל השינויים שעשינו יופיעו ב-XML החדש.

איך עושים את זה? בואו ונניח שאני רוצה להוסיף את תכונת revised לפתק הראשון ואז להמיר את הכל חזרה ל-XML:

<?php
$xml = simplexml_load_file('XMLFile.xml');

$xml->note[0]->revised = 'true';

header('Content-Type: text/xml'); 
print $xml->asXML();

זו התוצאה שאקבל:

XML reader

אפשר לראות שלפתק הראשון נוספה תכונת revised.

אני משתמש ב-header על מנת לגרום ל-XML להיות ולידי. אם אתם מדפיסים XML באמצעות פונקצית asXML, תעשו לעצמכם טובה ותשתמשו תמיד ב:

header('Content-Type: text/xml'); 

זה יחסוך לכם לא מעט כאב ראש.

כמובן שאפשר להמשיך ולהתפלפל בנושאי XML על מאות דפים, אבל החומר הבסיסי הזה מראה לכם כמה קל לעבוד עם XML ועם PHP וכמה לא צריך לפחד לא מ-JSON ולא מ-AJAX.

תגיות: , , , ,

רן בר-זיק

מתכנת PHP מנוסה ובעל ידע רב בפיתוח לאינטרנט על בסיס LAMP. מומחה במערכות דרופל, ג'ומלה ו-וורדפרס. שולט היטב בכל מה שקשור לפרונט אנד: JavaScript: jQuery ו-MooTools,ActionScript 2/3 וכמובן HTML 5 + CSS 3.אינטרנט ישראל: www.internet-israel.com

תגובות בפייסבוק