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

XML versus the New Kids on the Block (PHPBNL201...

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

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

Avatar for David Zuelke

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