Obsah
{ "jméno":"Jan", "příjmení":"Novák", "adresa": { "typ":"pracovní", "ulice":"Botanická", "čísloOrganizační":"68a", "město":"Brno" } }
<?xml version="1.0" encoding="UTF-8"?> <osoba> <jméno>Jan</jméno> <příjmení>Novák</příjmení> <adresa typ="pracovní"> <ulice>Botanická</ulice> <čísloOrganizační>68a</čísloOrganizační> <město>Brno</město> </adresa> </osoba>
JavaScript
nativní podpora
parsing
funkce eval - vhodné pouze při práci s daty ze spolehlivého a důvěryhodného zdroje
var osoba = eval( "{" + kontakt + "}");
metoda JSON.parse() - součástí 4. vydání standardu ECMAScript
JSON parser - obsažen např. v moderních prohlížečích (Firefox 3.5, IE 8, Opera 10.5, Google Chrome, Safari, ...)
PHP - podpora od verze 5.2
Ostatní jazyky - pomocí knihoven
Java - org.json, Json-lib, ...
C - JSON_checker, JSON parser, ...
C++ - jsoncpp, zoolib, ...
další viz např www.json.org
YAML není přímou náhradou XML, není určen pro dokumenty, ale pro serializaci dat
akronym dříve označoval "Yet Another Markup Language", podobnost s XML ale není taková, aby to bylo vhodné
první specifikace květen 2001
nyní (květen 2010) aktuální verze YAML 1.2 (3rd Edition)
Příklad asociativního pole (mapy):
hr: 65 # Home runs
avg: 0.278 # Batting average
rbi: 147 # Runs Batted In
YAML dovoluje do jednoho proudu dat umístit i více dokumentů (souborů)
Oddělujeme je symbolem "tři znaky minus":
---
Dokument končí buďto začátkem dalšího nebo symbolem "tři
tečky": ...
# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey
# Team ranking
---
- Chicago Cubs
- St Louis Cardinals
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
---
hr:
- Mark McGwire
# Following node labeled SS
- &SS Sammy Sosa
rbi:
- *SS # Subsequent occurrence
- Ken Griffey
Mohou mapovat jak mezi skalárními, tak strukturovanými
objekty, pomocí dvojice ? :
? - Detroit Tigers
- Chicago cubs
:
- 2001-07-23
? [ New York Yankees,
Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
2001-08-14 ]
Integrace XML fragmentů do YAML je snadná:
---
example: >
HTML goes into YAML without modification
message: |
<font name='times' size=10>
<p><i>"Three is always greater than
two, even for large values of two"</i>
</p><p> --Author Unknown </p></font>
date: 2007-06-01
Běžné programovací jazyky nabízejí knihovny pro práci s YAML:
yaml-cpp (pro YAML 1.2)
autor J. Clark, klasický parser pro zpracování řízené
událostmi (call-back), koncepčně podobné SAX, velmi rychlé, část
knihovny libexpat.so
pro Linux
knihovna pro systémy Windows, použitelná z různých programovacích jazyků
je to knihovna pro systémy Linux/UNIX, použitelná např. z
C/C++, část projektu Gnome, ale nevyžaduje jej; zvládá parsing,
zápis, vyhodnocování XPath, XSLT transformace (separátně v
libxslt
)
port parseru Xerces pro C++
V zásadě shodná s přístupem v Javě, existují rozhraní:
DOM pro PHP - plná škála možností, na něž jsme z DOM zvyklí (čtení, validace, zápis vč. prettyprinting, přímé programové vytváření dokumentu, jeho elementů, atd.)
SimpleXML - velmi jednoduché a hojně používané, umožňuje iteraci po prvcích XML, přímé vyhodnocování XPath výrazů atd.
SAX - obdobně jako v Javě, princip stejný, obsaženo ve většině PHP kompilací
Následující kód načte (analyzuje, "parsuje") XML dokument a zapíše jej (serializuje) do souboru
$dom = new DOMDocument();
// konfigurace pro načtení
$dom->preserveWhiteSpace = FALSE;
$dom->load('input.xml');
// konfigurace pro uložení
$dom->formatOutput = TRUE;
$dom->encoding = 'utf-8';
$dom->save('output.xml');
Následující kód načte (analyzuje, "parsuje") XML dokument s knihami a informace o nich vypíše (převzato z Reading and writing the XML DOM with PHP Using the DOM library, SAX parser and regular expressions, Jack Herrington, IBM 2005)
<?php
$g_books = array();
$g_elem = null;
function startElement( $parser, $name, $attrs )
{
global $g_books, $g_elem;
if ( $name == 'BOOK' ) $g_books []= array();
$g_elem = $name;
}
function endElement( $parser, $name )
{
global $g_elem;
$g_elem = null;
}
function textData( $parser, $text )
{
global $g_books, $g_elem;
if ( $g_elem == 'AUTHOR' ||
$g_elem == 'PUBLISHER' ||
$g_elem == 'TITLE' )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
}
}
$parser = xml_parser_create();
xml_set_element_handler( $parser, "startElement", "endElement" );
xml_set_character_data_handler( $parser, "textData" );
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
xml_parser_free( $parser );
foreach( $g_books as $book )
{
echo $book['TITLE']." - ".$book['AUTHOR']." - ";
echo $book['PUBLISHER']."\n";
}
?>
Převzato z SimpleXML processing with PHP A markup-specific library for XML processing in PHP by Elliotte Rusty Harold, IBM Developerworks, 2006
<html xml:lang="en" lang="en">
<head>
<title>XPath Example</title>
</head>
<body>
<?php
$rss = simplexml_load_file('http://partners.userland.com/nytRss/nytHomepage.xml');
foreach ($rss->xpath('//title') as $title) {
echo "<h2>" . $title . "</h2>";
}
?>
</body>
</html>
Výborný úvodní článek ke XML v PHP na IBM Developerworks: Reading and writing the XML DOM with PHP
Elliotte Rusty Harold: SimpleXML processing with PHP A markup-specific library for XML processing in PHP