CS 328 - Week 15 Lecture 1 - 2025-05-05

TODAY WE WILL
*   announcements
*   WHIRLWIND TOUR intro to XML and JSON
*   prep for next class

=====
*   should be reading/working through zyBooks Chapter 7 - 7.1, 7.7, 7.8, 7.9
    *   talking about some of this now!
    *   deadline for credit for its activities: 11:59 pm Friday, May 9

*   Homework 11 IS the last homework;
    *   improved versions of problems from Homeworks 10 and 11 must be
        submitted by 11:59 pm on SATURDAY, MAY 10

    *   WATCH for class e-mail when 
        homework-small-extra-credit JavaScript problem 
        is posted, to be due by 11:59 pm on FRIDAY, MAY 9

************
intro to XML and JSON
************
*   XML - eXtensible Markup Language 
    JSON - JavaScript Object Notation

*   XML and JSON are really just two text-based notations for:
    *   representing data, 
    *   stucturing data,
    *   passing it back and forth between applications;

    ...being text-based, they are lovely and portable!

    ...being standards, applications and DBMSs can agree
       to output and input data in these notations
       to make it easier to transfer data back and forth...!

    *   (and BOTH are used for such in both web
        applications AND other applications as well)

    *   both are structured enough --
        and have strict-enough syntax --
	that it is quite reasonable to parse them as desired;

	BUT! both are widely-used enough
	that there are quite a few LIBRARIES
	out there so you don't necessarily HAVE
	to write your own code to parse them;

	*   (for example, PHP has libraries for both!)

=====
first: more on XML
=====
*   again: eXtensible Markup Language
*   a W3C thing!

*   designed to DESCRIBE data,
    and focus on WHAT data is;

*   it IS a markup language, using a strict-style-HTML type of syntax --
    it DOES use tags in angle brackets!

    ...you could argue it is really a META-language, that lets
    individuals or groups specify/create customized markup languages;

    *   and also provides a way to specify rules for
        those languages;

*   XML tags are NOT predefined --
    you define your own, but following this strict, specific syntax
    
    *   and you can formalize the rules for your resulting markup
        language for your desired domain by defining
	either an XML SCHEMA or a DOCUMENT TYPE DEFINITION (DTD)
	
	*   (these are two different ways of expressing such
	    rules,

        *   and both provide a way to VALIDATE data that is
	    supposedly written using the resulting rules)

    *   that is, when a group/organization/individual etc. wants to 
        formalize a set of elements and rules for describing a 
        certain kind of data,

        they can formalize those in a DTD (Document Type Definition)
        and/or an XML Schema to describe that type of data,

        *   and then applications can use those to verify XML using those
            formats

=====
a little XML terminology
=====
*   XML with correct syntax is called:  *well-formed* XML

    XML validated against a
        DTD or XML schema is called:    *valid* XML

*   a well-formed XML must follow a standard structure:
      ^^^^^^^^^^^
                       vvvvvvvvvvvv
    *   starts with an XML prologue, which includes an XML declaration
        and (if applicable) which DTD or XML Schema is being followed

    *   example of an XML declaration:

        <?xml version="1.0" encoding="ISO-8859-1" ?>

    *   example of a DTD declaration/doctype:

        <!DOCTYPE html PUBLC "-//W3C//DTD XHTML 1.1//EN"
            "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

*   after the XML prologue you need a root element!
    *   a root element contains all of the other elements

        (like the html element is the root element for an HTML document...)

        *   that is, all of the document's content is within that
	    root element

*   XML's syntax SHOULD hopefully sound familiar since you've been
    writing strict-style HTML this semester:

    *   an element is defined as everything from its start tag <blah> to
        its end tag </blah>, including everything in-between
	
        *   and an element's content is everything between its start
            and end tags (*not* including the start and end tags)

    *   Every element must have a start tag and an end tag.
        ...elements that can never have content (void elements)
        must be written as:

        <blah />

        *   (so they are written as both start and end tags)

*   comment:  <!-- comment -->

*   Start tag and end tag element names must match;
    *   and case matters in element names in start and end tags
        (they are case-sensitive)
	
*   Start tags can contain attributes,
    but each attribute must have a value,
    and that attribute value must be quoted
        (single or double quotes are fine)

*   elements must be properly nested

*   elements are related as parents and children
    *   the root element is parent for other elements in the document
        (and maybe grandparent, great-grandparent, etc.)

        *   it is an ancestor for all of the other elements in the
            document

    *   an element B within another element A can be called a child element
        of element A
        (and element B might itself contain children elements,
        and those would be grandchildren of element A,
        etc. -- can have levels of descendants)

*   elements can have different kinds of content:
    *   element content - an element contains one or more
           other elements (and that's it)

        *   this element, moo, has element content:

            <moo><baa> Wool </baa></moo>

        *   in xml-ex1.xml, root element note has element content

    *   simple content - has JUST text content

        *   here:

            <moo><baa> Wool </baa></moo>

            ...element baa has simple content

        *   in xml-ex1.xml, elements date, to, from, heading, and body
            all have simple content

    *   mixed content - an element contains both element and simple
        content

        *   here:
     
            <poster> Upcoming Event 
                     <bullet> Date </bullet>
                     <bullet> Time </bullet>
            </poster>

            ...element poster has mixed content

        *   in my-first-xml-book.xml, both instances of the chapter
            element have mixed content
            
    *   empty content - an element has no content

        *   I *believe* (based on W3Schools) BOTH of these are considered to
            have empty content:

            <sound />
            <aroma></aroma>

        *   in xml-ex1.xml, element widget has empty content, and
            in my-first-xml-book.xml, element prod has empty content
            (remembering that attributes are NOT content)

*   and NOTE: if an element has attributes, those are NOT
    considered content! <-- content is between start and and tags!

*   see some examples of XML (adapted from several sources) in the posted:
    *   xml-ex1.xml
    *   xml-ex2.xml
    *   my-first-xml-book.xml
    *   xml-messages.xml

=====
JSON - JavaScript Object Notation
=====
*   another text-based notation for structuring data,
    BASED on JavaScript's object syntax;

    it is BASED on JavaScript's object syntax,
    but is NOT identical to it!!!

*   JavaScript developer Douglas Crockford says he "discovered"
    it (rather than calling himself its inventor!)
    for exchanging data conveniently

    *   yes, JavaScript works very well with it!
    *   BUT other languages often include tools for
        dealing with it, as well

*   useful approach: consider JavaScript object syntax,
    then compare it to JSON:

=====
JavaScript object *syntax*
=====
*   JavaScript uses a prototype object model

    ...you can just create an object!

    *   (you don't have to create a class first)

*   object literal syntax:
    write a set of comma-separated data field/value pairs
    inside curly braces:

    {
        datafieldname1: value1,
	datafieldname2: value2,
	...
	datafieldnameN: valueN
    }

    *   want a method?
        ...make the datafieldname's value a function!

    *   want an array data field?
        ...make the value an array!

    ...and that's a JavaScript object literal!
    *   it can be assigned to a variable, it can be passed
        to a function, etc.!

*   if you assign an object literal to a variable,
    you can access its data fields using the familiar dot notation

    my_object.datafieldname

    *   although you can ALSO use associative-array syntax as well,
        treating the data field name like an associate-array key!

        my_object["fieldname"]

*   see example posted along with these notes:
    *   js-object.js

    and also:
    *   js-object-demo.php
    
        ...that demos some JavaScript expressions
        using this example JavaScript object's data fields
    
=====
JSON syntax
=====
*   BASED on JavaScript object notation,
    WITH some differences!

    *   you HAVE to put the JSON data field names in DOUBLE-QUOTES
        *   (we saw, in js-object.js's object literal example,
	    that this is NOT the case for a JavaScript object!)

    *   a JSON data field may NOT have a function as its value
   
    *   a JSON data field CAN have as its value:
        *   numeric data,
	*   string data,
	*   array data, or
	*   JSON data, though!
   
    *   a FEW character are forbidden on JSON for compatibility reasons

        *   a *cursory* Google search implies maybe they just have to be
	    escaped, though... like a double-quote or a backspace...?

        *   I did find that a \ within a JSON data field's string
            "broke" an example JSON object, but replacing it with \\ seemed
            to be fine.

    *   you cannot have comments in JSON...!
        *   CAN kluge by putting them in a data field!!!

*   Many languages can handle JSON data --

    JavaScript is definitely one of those!

    *   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
        notes the following about JavaScript's object JSON:
	
	"The JSON namespace object contains static methods for
	parsing values from and converting values to
	JavaScript Object Notation (JSON)."

    *   you can transform a JSON string into a JavaScript object using
        the JSON object's parse method:

        let myObjVersion = JSON.parse(myJSONString);

    *   and you can convert a JavaScript object into a JSON string version
        using the JSON object's stringify method:

        let myJSONVersion = JSON.stringify(myJavaScriptObject);

        *   note: looking at js-object-demo.php's last alert pop-up
	    when it is run, it *looks* like JSON.stringify() may simply OMIT
	    methods/data fields with function values;

*   see some examples of JSON (adapted from "Web Programming Step by Step", 2nd edition,
    by Stepp, Miller, and Kirst):
    *   json-response-data.json
    *   json-books.json
    *   json-messages.json

=====
*   also now posted after class:
    *   simplexml-demo1.php: demos PHP SimpleXML package

    *   php-json-demo.php: demos PHP JSON extension

*   you will practice lightly with these in Friday's lab exercise