Alternativas a XML
JSON, YAML, SXML, CSV, RDF
Jose Emilio Labra Gayo
Depto. Informática
Universidad de Oviedo
Tipos de representación
Los tipos de representación se identifican con MIME
MIME (Multipurpose Internet Mail Extensions)
Identificar el tipo de contenido (Cabecera Content-type)
Formato tipo/subtipo
Ejemplos:
Lista oficial: http://www.iana.org/assignments/media-types
text/html: Página Web en formato HTML
text/xml, application/xml : Documento XML
application/json: Documento JSON
application/pdf: Fichero PDF
image/jpeg: Imagen JPEG
application/rdf+xml: Documento RDF
text/csv: Documento CSV
text/turtle: Documento Turtle
. . .
Alternativas a XML
Varias alternativas a la sintaxis XML
JSON
YAML
SXML
CSV
RDF
JSON
JSON = Javascript Object Notation
Subconjunto de Javascript para representar datos
Independiente de lenguaje y fácil de analizar
Estandarizado: RFD 4627
Librerías para múltiples lenguajes:
C, C++, C#, Delphi, Haskell, Java, Lisp, Perl, PHP, Python,
Ruby, Scheme, etc.
http://json.org/
Douglas Crockford
JSON. Ejemplo
Editores JSON:
http://www.jsoneditoronline.org/
http://braincast.nl/samples/jsoneditor/
{ "pedido": {
"fecha": "2017-05-29",
"productos": [
{ "codigo" : "R23" ,
"nombre" : "Rotulador",
"cantidad" : 20
},
{ "codigo" : "G56" ,
"nombre" : "Grapadora",
"cantidad" : 2
}
]
}
}
JSON: Valores básicos
Cadenas de caracteres
Caracteres Unicode
Dentro de comillas dobles.
"Juan" "Año"
Números
Enteros, reales
Booleanos
true
false
Null
JSON: Valores compuestos
Objetos
Asociaciones de tipo clave : valor
Entre llaves { }
Ejemplo:
{ "nombre" : "Juan" , "edad" : 23 }
Arrays
Secuencias de valores
Pueden ser de diferentes tipos
Entre corchetes [ ]
[2, "tres", true]
Objetos y arrays pueden anidarse
{ "pedido": {
"fecha": "2017-05-29",
"productos": [
{ "codigo" : "R23" ,
"nombre" : "Rotulador",
"cantidad" : 20
},
{ "codigo" : "G56" ,
"nombre" : "Grapadora",
"cantidad" : 2
}
]
}
}
JSON. Estructura jerárquica
Documentos JSON tienen estructura de árbol
"pedido"
"productos""fecha"
"2017-05-29"
0 1
"código"
"nombre"
"cantidad"
"G56" "Grapadora" 2
"código"
"nombre"
"cantidad"
"R23" "Rotulador" 20
JSON. JSON en Javascript
<script type="text/javascript"
src="http://www.json.org/json.js">
</script>
<script type="text/javascript">
x = [3, "tres"]
alert("Convertido en JSON: " + x.toJSONString())
alert("Analizando JSON...")
str = "[4, "cuatro"]"
r = str.parseJSON()
for (i=0; i < r.length; i++) {
alert("Elemento " + i + " = " + r[i])
}
</script>
JSON. Uso en Ajax
var objeto;
var htr = new XMLHTTPRequest();
htr.open("GET",url,true);
htr.send(null);
htr.onreadystatechange = function () {
if (htr.readyState == 4 ) {
if (htr.status == 200) {
objeto = eval("{" + htr.responseText + "}" );
}
else {
alert("Problema con la URL");
}
}
} Problemas de seguridad al utilizar eval.
Recomendación:
Utilizar parseJSON()
JSON Schema
Permite validar documentos JSON
Especificación en IETF: http://json-schema.org/
{"type": "object",
"properties": {
"pedido": { "type": "object",
"properties": {
"fecha": { "type": "string", "format": "date-time" },
"productos": {
"type": "array", "minItems": 1, "items": { "type": "object",
"properties": {
"código": {"type": "string", "pattern": "[A-Z]d{2}" },
"nombre": {"type": "string"},
"cantidad": { "type": "integer", "minimum": 1 }
},
"required": ["código", "cantidad" ]
}}
},
"required": ["fecha", "productos"]
}}}
{ "pedido": {
"fecha": "2017-05-29",
"productos": [
{ "codigo" : "R23" ,
"nombre" : "Rotulador",
"cantidad" : 20
},
{ "codigo" : "G56" ,
"nombre" : "Grapadora",
"cantidad" : 2
}
]}}
JSON. Comparación con XML
Ventajas
Analizador de JSON puede ser más eficiente
Facilidad de procesamiento
Utilización en muchas APIs
Legibilidad similar a XML
Retos
Validación: JSON Schema no es muy popular
¿Espacios de nombres?
¿Entidades?
YAML
YAML (YAML Ain't a Markup Language)
Propuesto por C. Evans (2001) como lenguaje
para representar datos
Objetivos:
Facilidad de edición manual
Representación de tipos de datos habituales en
lenguajes
Independiente del lenguaje
Incluye JSON como un subconjunto
YAML. Ejemplo
{ "pedido":
{ "producto": [ "codigo" : "R23" ],
"nombre" : "Rotulador RX2"
"cantidad" : 20,
"comentarios" : "Comprobad que escriben"
},
{ "producto": [ "codigo" : "G56" ],
"nombre" : "Grapadora Lin"
"cantidad" : 2,
"comentarios" : "Envuelta para regalo"
}
}
Estilo en línea
Idéntico a JSON
Estilo basado
en indentación
Evita comillas, llaves y
corchetes
---
pedido:
producto:
- codigo : R23
nombre : Rotulador RX2
cantidad : 20
comentarios : Comprobad que escriben
producto:
- codigo : G56
nombre : Grapadora Lin
cantidad : 2
comentarios : Envuelta para regalo
YAML. Tipos de datos y Referencias
Pueden definirse tipos de datos mediante !!
Referencias
&nombre: define un valor
*nombre: referencia a un valor
<<: Mezcla parejas de clave/valor
---
ingredientes:
Cabrales: &id001
nombre : Queso Cabrales
tipo: Queso
cantidad: !!integer 1
Edam:
<<: *id001
nombre : Queso Edam
---
ingredientes:
Cabrales: &id001
nombre : Queso Cabrales
tipo: Queso
cantidad: !!integer 1
Edam:
nombre : Queso Edam
tipo: Queso
cantidad: !!integer 1
YAML. Comparación con XML
Ventajas
Legibilidad para edición manual
Problemas
Espacios de nombres
Validación (Kwalify)
Cortar/pegar manteniendo indentación
SXML
SXML: Scheme & XML
Representar XML mediante S-Expresiones
S-Expresiones: desarrolladas para LISP (y Scheme)
LISP: Lenguaje funcional creado en 1958
(pedido (producto (@ (codigo "R23"))
(nombre "Rotulador")
(cantidad 20)
(comentarios "Comprobad que escriben")
)
(producto (@ (codigo "G56"))
(nombre "Grapadora Lin")
(cantidad 2)
(comentarios "Envuelta para regalo")
)
)
CSV
CSV = Comma Separated Values
Formato muy popular hojas de calculo y bases
de datos
Utilizado desde 1967
Se popularizó sin especificación estándar
CSV on the Web (CSVW): para añadir metadatos
Ejemplo:
codigo, nombre, cantidad, comentarios
R23, Rotulador, 20, Comprobad que escriben
G56, Grapadora, 2, Envuelta para regalo
CSV on the Web
Permite definir la estructura de ficheros CSV
Incluye tipos de datos basados en XML Schema
Herramienta: CSVLint
{ "fields": [ {
"name": "Codigo",
"constraints": { "required": true, "unique": true }
},
{ "name": "Nombre",
"description": "Nombre del producto",
"constraints": { "required": true }
},
{ "name": "Cantidad",
"title": "Cantidad",
"constraints": { "required": true,
"type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
}},
{ "name": "Comentarios",
"title": "Comentarios",
"constraints":{ "required": true }
}] }
codigo, nombre, cantidad, comentarios
R23, Rotulador, 20, Comprobad que escriben
G56, Grapadora, 2, Envuelta para regalo
RDF
Resource Description Framework
Basado en grafo
Declaraciones del tipo
Sujeto - predicado - objeto
Los predicados se identifican con URIs
Sujetos: URIs o nodos anónimos
Objetos: URIs, nodos anónimos ó literales
Ejemplo en RDF
prefix schema: <http://schema.org/>
prefix : <http://ejemplo.org/>
prefix dbr: <http://dbpedia.org/resource/>
:p1 a schema:Order ;
schema:orderDate "2017-05-29T23:00:00Z" ;
schema:orderedItem :item1, :item2 .
:item1 a schema:Product ;
schema:identifier "R23" ;
schema:name "Rotulador" ;
schema:orderQuantity 20 ;
schema:sameAs dbr:Marker_pen .
:item2 a schema:Product ;
schema:identifier "G56" ;
schema:name "Grapadora" ;
schema:orderQuantity 2 ;
schema:sameAs dbr:Stapler .
Validación de RDF
Alternativas: Shape Expressions, SHACL
:p1 a schema:Order ;
schema:orderDate "2017-05-29T23:00:00Z";
schema:orderedItem :item1, :item2 .
:item1 a schema:OrderItem ;
schema:identifier "R23" ;
schema:name "Rotulador" ;
schema:orderQuantity 20 ;
schema:sameAs dbr:Marker_pen .
:item2 a schema:OrderItem ;
schema:identifier "G56" ;
schema:name "Grapadora" ;
schema:orderQuantity 2 ;
schema:sameAs dbr:Stapler .
<Order> {
a [schema:Order] ;
schema:orderDate xsd:dateTime ;
schema:orderedItem @<Item>+
}
<Item> {
schema:identifier xsd:string ;
schema:name xsd:string ;
schema:orderQuantity xsd:integer;
schema:sameAs IRI
}
JSON-LD
Representación de RDF en JSON
https://json-ld.org/
{
"@context": "http://ejemplo.org/contexto.jsonld",
"@graph": [
{ "@id": ":p1",
"productos": [ {"@id": ":item1" }, {"@id": ":item2" } ]
},
{"@id": ":item1",
"codigo": "R23",
"nombre": "Rotulador",
"cantidad": 20,
"ref": "dbr:Marker_pen"
},
{"@id": ":item2",
"codigo": "G56",
"nombre": "Grapadora",
"cantidad": 2,
"ref": "dbr:Stapler"
}
]
}
{"@context": "http://ejemplo.org/contexto.jsonld" {
"": "http://ejemplo.org/",
"schema": "http://schema.org/",
"dbr": "http://dbpedia.org/resource/",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"productos": {"@id": "schema:orderItem" },
"nombre": { "@id": "schema:name" },
"codigo": {"@id": "schema:identifier" },
"cantidad": {"@id": "schema:orderQuantity" },
"ref": {"@id": "schema:sameAs" },
}
}
Comparación
Tecnología Validación Modelo de datos
XML DTDs
XML Schema
RelaxNG
Schematron
Árbol
Contenido mixto
Texto/etiquetas
Elementos ordenados
Atributos no ordenados
JSON JSON
Schema
Árbol
Objetos: clave/valor no ordenados
Arrays: contenido ordenado
CSV CSVW Tabla
Elementos ordenados
RDF ShEx
SHACL
Grafo
Arcos no ordenados
Uso de URIs para integración
Datos enlazados
Varias sintaxis: Turtle, JSON-LD,...

16 Alternativas XML

  • 1.
    Alternativas a XML JSON,YAML, SXML, CSV, RDF Jose Emilio Labra Gayo Depto. Informática Universidad de Oviedo
  • 2.
    Tipos de representación Lostipos de representación se identifican con MIME MIME (Multipurpose Internet Mail Extensions) Identificar el tipo de contenido (Cabecera Content-type) Formato tipo/subtipo Ejemplos: Lista oficial: http://www.iana.org/assignments/media-types text/html: Página Web en formato HTML text/xml, application/xml : Documento XML application/json: Documento JSON application/pdf: Fichero PDF image/jpeg: Imagen JPEG application/rdf+xml: Documento RDF text/csv: Documento CSV text/turtle: Documento Turtle . . .
  • 3.
    Alternativas a XML Variasalternativas a la sintaxis XML JSON YAML SXML CSV RDF
  • 4.
    JSON JSON = JavascriptObject Notation Subconjunto de Javascript para representar datos Independiente de lenguaje y fácil de analizar Estandarizado: RFD 4627 Librerías para múltiples lenguajes: C, C++, C#, Delphi, Haskell, Java, Lisp, Perl, PHP, Python, Ruby, Scheme, etc. http://json.org/ Douglas Crockford
  • 5.
    JSON. Ejemplo Editores JSON: http://www.jsoneditoronline.org/ http://braincast.nl/samples/jsoneditor/ {"pedido": { "fecha": "2017-05-29", "productos": [ { "codigo" : "R23" , "nombre" : "Rotulador", "cantidad" : 20 }, { "codigo" : "G56" , "nombre" : "Grapadora", "cantidad" : 2 } ] } }
  • 6.
    JSON: Valores básicos Cadenasde caracteres Caracteres Unicode Dentro de comillas dobles. "Juan" "Año" Números Enteros, reales Booleanos true false Null
  • 7.
    JSON: Valores compuestos Objetos Asociacionesde tipo clave : valor Entre llaves { } Ejemplo: { "nombre" : "Juan" , "edad" : 23 } Arrays Secuencias de valores Pueden ser de diferentes tipos Entre corchetes [ ] [2, "tres", true] Objetos y arrays pueden anidarse
  • 8.
    { "pedido": { "fecha":"2017-05-29", "productos": [ { "codigo" : "R23" , "nombre" : "Rotulador", "cantidad" : 20 }, { "codigo" : "G56" , "nombre" : "Grapadora", "cantidad" : 2 } ] } } JSON. Estructura jerárquica Documentos JSON tienen estructura de árbol "pedido" "productos""fecha" "2017-05-29" 0 1 "código" "nombre" "cantidad" "G56" "Grapadora" 2 "código" "nombre" "cantidad" "R23" "Rotulador" 20
  • 9.
    JSON. JSON enJavascript <script type="text/javascript" src="http://www.json.org/json.js"> </script> <script type="text/javascript"> x = [3, "tres"] alert("Convertido en JSON: " + x.toJSONString()) alert("Analizando JSON...") str = "[4, "cuatro"]" r = str.parseJSON() for (i=0; i < r.length; i++) { alert("Elemento " + i + " = " + r[i]) } </script>
  • 10.
    JSON. Uso enAjax var objeto; var htr = new XMLHTTPRequest(); htr.open("GET",url,true); htr.send(null); htr.onreadystatechange = function () { if (htr.readyState == 4 ) { if (htr.status == 200) { objeto = eval("{" + htr.responseText + "}" ); } else { alert("Problema con la URL"); } } } Problemas de seguridad al utilizar eval. Recomendación: Utilizar parseJSON()
  • 11.
    JSON Schema Permite validardocumentos JSON Especificación en IETF: http://json-schema.org/ {"type": "object", "properties": { "pedido": { "type": "object", "properties": { "fecha": { "type": "string", "format": "date-time" }, "productos": { "type": "array", "minItems": 1, "items": { "type": "object", "properties": { "código": {"type": "string", "pattern": "[A-Z]d{2}" }, "nombre": {"type": "string"}, "cantidad": { "type": "integer", "minimum": 1 } }, "required": ["código", "cantidad" ] }} }, "required": ["fecha", "productos"] }}} { "pedido": { "fecha": "2017-05-29", "productos": [ { "codigo" : "R23" , "nombre" : "Rotulador", "cantidad" : 20 }, { "codigo" : "G56" , "nombre" : "Grapadora", "cantidad" : 2 } ]}}
  • 12.
    JSON. Comparación conXML Ventajas Analizador de JSON puede ser más eficiente Facilidad de procesamiento Utilización en muchas APIs Legibilidad similar a XML Retos Validación: JSON Schema no es muy popular ¿Espacios de nombres? ¿Entidades?
  • 13.
    YAML YAML (YAML Ain'ta Markup Language) Propuesto por C. Evans (2001) como lenguaje para representar datos Objetivos: Facilidad de edición manual Representación de tipos de datos habituales en lenguajes Independiente del lenguaje Incluye JSON como un subconjunto
  • 14.
    YAML. Ejemplo { "pedido": {"producto": [ "codigo" : "R23" ], "nombre" : "Rotulador RX2" "cantidad" : 20, "comentarios" : "Comprobad que escriben" }, { "producto": [ "codigo" : "G56" ], "nombre" : "Grapadora Lin" "cantidad" : 2, "comentarios" : "Envuelta para regalo" } } Estilo en línea Idéntico a JSON Estilo basado en indentación Evita comillas, llaves y corchetes --- pedido: producto: - codigo : R23 nombre : Rotulador RX2 cantidad : 20 comentarios : Comprobad que escriben producto: - codigo : G56 nombre : Grapadora Lin cantidad : 2 comentarios : Envuelta para regalo
  • 15.
    YAML. Tipos dedatos y Referencias Pueden definirse tipos de datos mediante !! Referencias &nombre: define un valor *nombre: referencia a un valor <<: Mezcla parejas de clave/valor --- ingredientes: Cabrales: &id001 nombre : Queso Cabrales tipo: Queso cantidad: !!integer 1 Edam: <<: *id001 nombre : Queso Edam --- ingredientes: Cabrales: &id001 nombre : Queso Cabrales tipo: Queso cantidad: !!integer 1 Edam: nombre : Queso Edam tipo: Queso cantidad: !!integer 1
  • 16.
    YAML. Comparación conXML Ventajas Legibilidad para edición manual Problemas Espacios de nombres Validación (Kwalify) Cortar/pegar manteniendo indentación
  • 17.
    SXML SXML: Scheme &XML Representar XML mediante S-Expresiones S-Expresiones: desarrolladas para LISP (y Scheme) LISP: Lenguaje funcional creado en 1958 (pedido (producto (@ (codigo "R23")) (nombre "Rotulador") (cantidad 20) (comentarios "Comprobad que escriben") ) (producto (@ (codigo "G56")) (nombre "Grapadora Lin") (cantidad 2) (comentarios "Envuelta para regalo") ) )
  • 18.
    CSV CSV = CommaSeparated Values Formato muy popular hojas de calculo y bases de datos Utilizado desde 1967 Se popularizó sin especificación estándar CSV on the Web (CSVW): para añadir metadatos Ejemplo: codigo, nombre, cantidad, comentarios R23, Rotulador, 20, Comprobad que escriben G56, Grapadora, 2, Envuelta para regalo
  • 19.
    CSV on theWeb Permite definir la estructura de ficheros CSV Incluye tipos de datos basados en XML Schema Herramienta: CSVLint { "fields": [ { "name": "Codigo", "constraints": { "required": true, "unique": true } }, { "name": "Nombre", "description": "Nombre del producto", "constraints": { "required": true } }, { "name": "Cantidad", "title": "Cantidad", "constraints": { "required": true, "type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger" }}, { "name": "Comentarios", "title": "Comentarios", "constraints":{ "required": true } }] } codigo, nombre, cantidad, comentarios R23, Rotulador, 20, Comprobad que escriben G56, Grapadora, 2, Envuelta para regalo
  • 20.
    RDF Resource Description Framework Basadoen grafo Declaraciones del tipo Sujeto - predicado - objeto Los predicados se identifican con URIs Sujetos: URIs o nodos anónimos Objetos: URIs, nodos anónimos ó literales
  • 21.
    Ejemplo en RDF prefixschema: <http://schema.org/> prefix : <http://ejemplo.org/> prefix dbr: <http://dbpedia.org/resource/> :p1 a schema:Order ; schema:orderDate "2017-05-29T23:00:00Z" ; schema:orderedItem :item1, :item2 . :item1 a schema:Product ; schema:identifier "R23" ; schema:name "Rotulador" ; schema:orderQuantity 20 ; schema:sameAs dbr:Marker_pen . :item2 a schema:Product ; schema:identifier "G56" ; schema:name "Grapadora" ; schema:orderQuantity 2 ; schema:sameAs dbr:Stapler .
  • 22.
    Validación de RDF Alternativas:Shape Expressions, SHACL :p1 a schema:Order ; schema:orderDate "2017-05-29T23:00:00Z"; schema:orderedItem :item1, :item2 . :item1 a schema:OrderItem ; schema:identifier "R23" ; schema:name "Rotulador" ; schema:orderQuantity 20 ; schema:sameAs dbr:Marker_pen . :item2 a schema:OrderItem ; schema:identifier "G56" ; schema:name "Grapadora" ; schema:orderQuantity 2 ; schema:sameAs dbr:Stapler . <Order> { a [schema:Order] ; schema:orderDate xsd:dateTime ; schema:orderedItem @<Item>+ } <Item> { schema:identifier xsd:string ; schema:name xsd:string ; schema:orderQuantity xsd:integer; schema:sameAs IRI }
  • 23.
    JSON-LD Representación de RDFen JSON https://json-ld.org/ { "@context": "http://ejemplo.org/contexto.jsonld", "@graph": [ { "@id": ":p1", "productos": [ {"@id": ":item1" }, {"@id": ":item2" } ] }, {"@id": ":item1", "codigo": "R23", "nombre": "Rotulador", "cantidad": 20, "ref": "dbr:Marker_pen" }, {"@id": ":item2", "codigo": "G56", "nombre": "Grapadora", "cantidad": 2, "ref": "dbr:Stapler" } ] } {"@context": "http://ejemplo.org/contexto.jsonld" { "": "http://ejemplo.org/", "schema": "http://schema.org/", "dbr": "http://dbpedia.org/resource/", "xsd": "http://www.w3.org/2001/XMLSchema#", "productos": {"@id": "schema:orderItem" }, "nombre": { "@id": "schema:name" }, "codigo": {"@id": "schema:identifier" }, "cantidad": {"@id": "schema:orderQuantity" }, "ref": {"@id": "schema:sameAs" }, } }
  • 24.
    Comparación Tecnología Validación Modelode datos XML DTDs XML Schema RelaxNG Schematron Árbol Contenido mixto Texto/etiquetas Elementos ordenados Atributos no ordenados JSON JSON Schema Árbol Objetos: clave/valor no ordenados Arrays: contenido ordenado CSV CSVW Tabla Elementos ordenados RDF ShEx SHACL Grafo Arcos no ordenados Uso de URIs para integración Datos enlazados Varias sintaxis: Turtle, JSON-LD,...