XML VS. THE NEW KIDS ON THE BLOCK
Jan 15, 2015
XMLVS.
THE NEW KIDS ON THE BLOCK
David Zülke
David Zuelke
http://en.wikipedia.org/wiki/File:EU-Germany.svg
http://en.wikipedia.org/wiki/File:München_Panorama.JPG
Founder
Lead Developer
TODAY'S MENU
• XML (and where it took a wrong turn)
• HTML 5 (and why it makes me very, very angry)
• JSON (and why it's not always as useful as you may think)
• YAML (and why it makes my eyes bleed)
but first
I'd like to hear from you, dear audience
what do you love, hate, adore or loathe with a passion?
XMLeXtensible Markup Language
"extensible" mostly refers to the Namespaces concept
VALIDATION
• XML Schema (validates the grammar of a document)
• RELAX NG (like XML Schema, just full of win)
• Except it's so awesome it sucks at reporting errors :(
• Schematron (validates the semantics of a document)
•DTD (RRRRRRRAAAAAAAAAAAAAAAAAGGGGEEEE)
OTHER GOODIES
• XPath and XQuery for querying documents
• XPath is an expression syntax, XQuery a full query language
• XSLT to transform documents to XML, HTML, text, ...
•Makes heavy use of XPath
• XIncludes
• Allow re-use of content within and across documents
READING AND WRITING
• Push Parsing, uses events to notify app during parsing
• Example: SAX
• Pull Parsing, allows app to retrieve or skip elements
• Example: PHP's ext/xmlreader
•DOM, constructs an object representation of the tree
• Example: DOM (duh)
but most importantly
Mixed Content!
<?xml version="1.0" encoding="utf-‐8"?><products xmlns="http://acme.com/shop/products"> <product id="123"> <name>Bacon</name> <price>5.99</price> </product></products>
<?xml version="1.0" encoding="utf-‐8"?><products xmlns="http://acme.com/shop/products"> <product id="123"> <name>Bacon</name> <price>5.99</price> OMNOMNOM Bacon </product></products>
and you can add elements without changing the structure
<?xml version="1.0" encoding="utf-‐8"?><products xmlns="http://acme.com/shop/products"> <product id="123"> <name>Bacon</name> <price>5.99</price> </product></products>
<?xml version="1.0" encoding="utf-‐8"?><products xmlns="http://acme.com/shop/products"> <product id="123"> <name xml:lang="en">Bacon</name> <name xml:lang="de">Speck</name> <price>5.99</price> </product></products>
<?xml version="1.0" encoding="utf-‐8"?><products xmlns="http://acme.com/shop/products"> <product id="123"> <name xml:lang="en">Bacon</name> <name xml:lang="de">Speck</name> <price>5.99</price> <link rel="category" href="..." /> </product></products>
XML: doing it right
<?xml version="1.0" encoding="utf-‐8" standalone="yes"?><search> <total_results>6</total_results> <items_per_page>2</items_per_page> <start_index>1</start_index> <link href="http://openapi.lovefilm.com/catalog/games?start_index=1&items_per_page=2&term=old" rel="self" title="self"/> <link href="http://openapi.lovefilm.com/catalog/games?start_index=3&items_per_page=2&term=old" rel="next" title="next"/> <link href="http://openapi.lovefilm.com/catalog/games?start_index=5&items_per_page=2&term=old" rel="last" title="last"/> <catalog_title> <can_rent>true</can_rent> <release_date>2003-‐09-‐12</release_date> <title full="Star Wars: Knights of the Old Republic" clean="Star Wars: Knights of the Old Republic"/> <id>http://openapi.lovefilm.com/catalog/title/59643</id> <adult>false</adult> <number_of_ratings>574</number_of_ratings> <rating>4</rating> <category scheme="http://openapi.lovefilm.com/categories/catalog" term="games"/> <category scheme="http://openapi.lovefilm.com/categories/format" term="Xbox"/> <category scheme="http://openapi.lovefilm.com/categories/genres" term="Adventure"/> <category scheme="http://openapi.lovefilm.com/categories/genres" term="Role-‐playing"/> <category scheme="http://openapi.lovefilm.com/categories/certificates/bbfc" term="TBC"/> <link href="http://openapi.lovefilm.com/catalog/title/59643/synopsis" rel="http://schemas.lovefilm.com/synopsis" title="synopsis"/> <link href="http://openapi.lovefilm.com/catalog/title/59643/reviews" rel="http://schemas.lovefilm.com/reviews" title="reviews"/> <link href="http://www.lovefilm.com/product/59643-‐Star-‐Wars-‐Knights-‐of-‐the-‐Old-‐Republic.html?cid=LFAPI" rel="alternate" title="web page"/> </catalog_title></search>
which brings me to...
HATEOAS AND HYPERMEDIAThe Main Ingredient For Your REST API
XML: doing it wrong
<?xml version="1.0" encoding="UTF-‐8"?><!DOCTYPE plist PUBLIC "-‐//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-‐1.0.dtd"><plist version="1.0"><dict> <key>DefaultProfileChoices</key> <dict> <key>AC Power</key> <integer>2</integer> <key>Battery Power</key> <integer>1</integer> <key>UPS Power</key> <integer>1</integer> </dict> <key>SystemProfileDefaults</key> <array><!-‐-‐ Profile 0 -‐-‐> <dict><!-‐-‐ AC Power -‐ unused -‐-‐> <key>AC Power</key> <dict> <!-‐-‐ ... -‐-‐> </dict> </dict> </array></dict></plist>
but pleasedo not serialize objects to XML
(I'm looking at you, SOAP)
HTML 5Such a mess :(
HTML 5
•Neither SGML nor XML
• so browser vendors need to write new (inefficient) parsers
•Does not have a DTD anymore
• how could it, given how it's not SGML...
• Completely idiotic stuff like data-* attributes
• And they're even proud of it...
<li class="user" data-‐name="John Resig" data-‐city="Boston" data-‐lang="js" data-‐food="Bacon"> <b>John says:</b> <span>Hello, how are you?</span></li>
but that's already possible in XML!
<li class="user" xmlns:myapp="http://myapp.com/v1" myapp:name="John Resig" myapp:city="Boston" myapp:lang="js" myapp:food="Bacon"> <b>John says:</b> <span>Hello, how are you?</span></li>
JSONJavaScript Object Notation
JSON PROS AND CONS
•Quite efficient, simple, universally supported in many languages
• Very good for serializing objects
• Built-in types, do not need explicit declaration
•No schemas
•No mixed content
win: store arbitrary keys and values
{ "_id" : "bc2a41170621c326ec68382f846d5764", "_rev" : "2612672603", "item" : "orange", "prices" : { "Fresh Mart" : 1.99, "Price Max" : 3.19, "Citrus Circus" : 1.09 }}
fail: use it as query language for your pile of crap database
{ foo: "bar" }
{ x : 3, y : "foo" }
{ $or : [ { a : 1 } , { b : 2 } ] }
{ j : { $ne: 3 }, k : { $gt: 10 } }
{ x : 3 }, { z : 1 }
{ j : { $in : [2,4,6] } }
{ "author.name" : "joe" }
YAMLYet Another Markup Language
YAMLYet Another Markup LanguageYAML Ain't Markup Language
recursive acronyms are cool
YAML also was cool at some point
a simple markup language, perfect for configuration files
autoload: # plugins plugins_lib: name: plugins lib path: %SF_PLUGINS_DIR%/*/lib recursive: true exclude: []
plugins_module_lib: name: plugins module lib path: %SF_PLUGINS_DIR%/*/modules/*/lib prefix: 2 recursive: true exclude: []
# project project: name: project path: %SF_LIB_DIR% recursive: true exclude: [model, symfony, deprecated]
but then...
foo: | -‐-‐-‐ foo: bar -‐-‐-‐ yo: bazbar: | fooness clipped: | This has one newline.
same as "clipped" above: "This has one newline.\n"
stripped: |-‐ This has no newline.
same as "stripped" above: "This has no newline."
kept: |+ This has four newlines.
same as "kept" above: "This has four newlines.\n\n\n\n"
-‐ &showell Steve-‐ Clark -‐ Brian -‐ Oren -‐ *showell
YAML DRAWBACKS
•Makes your eyes bleed
•No schemas or other forms of validation
• Forget a newline somewhere and the parser might look at you, helpless, like a deer in headlights
•No mixed content
CONCLUSION
• XML for hypermedia, documents, your new REST API
• JSON for serializing objects and storing them in e.g. CouchDB
• YAML for your configuration files
!e End
Questions?
THANK YOU!This was
http://joind.in/2269by
@dzuelke