Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XML versus the New Kids on the Block (PHPBNL2011 2011-01-29)

XML versus the New Kids on the Block (PHPBNL2011 2011-01-29)

Presentation given at PHP Benelux Conference 2011 in Antwerp, Belgium.

David Zuelke

January 29, 2011
Tweet

More Decks by David Zuelke

Other Decks in Programming

Transcript

  1. 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)
  2. 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)
  3. 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
  4. 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)
  5. <?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>
  6. <?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>
  7. <?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>
  8. <?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&amp;items_per_page=2&amp;term=old"                rel="self"  title="self"/>    <link  href="http://openapi.lovefilm.com/catalog/games?start_index=3&amp;items_per_page=2&amp;term=old"                rel="next"  title="next"/>    <link  href="http://openapi.lovefilm.com/catalog/games?start_index=5&amp;items_per_page=2&amp;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>
  9. <?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>
  10. 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...
  11. <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>
  12. <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>
  13. JSON KEY FEATURES • 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
  14. {        "_id"  :  "bc2a41170621c326ec68382f846d5764",      

     "_rev"  :  "2612672603",        "item"  :  "orange",        "prices"  :  {                "Fresh  Mart"  :  1.99,                "Price  Max"  :  3.19,                "Citrus  Circus"  :  1.09        } }
  15. {  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"  } {  "addresses.city"  :  "London"  }
  16. 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]
  17. foo:  |          -­‐-­‐-­‐      

     foo:  bar        -­‐-­‐-­‐        yo:  baz bar:  |          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
  18. 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
  19. 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