Persistencia de datos¶
La persistencia es la capacidad de guardar el estado de un objeto en algún tipo de almacenamiento, para poder restaurarlo en algún momento posteriormente.
XML¶
XML es la abreviatura de Extensible Markup Language y es un formato de intercambio de datos establecido. XML fue definido en 1998 por el World Wide Web Consortium (W3C). A diferencia de otros lenguajes, XML da soporte a bases de datos, siendo útil cuando varias aplicaciones deben comunicarse entre sí o integrar información.
Un documento XML consta de elementos, cada elemento tiene una etiqueta de inicio, contenido y una etiqueta de finalización. Una etiqueta consiste en una marca hecha en el documento, que señala una porción de este como un elemento. Un pedazo de información con un sentido claro y definido. Las etiquetas tienen la forma <nombre>
, donde nombre es el nombre del elemento que se está señalando.
Documento XML válido¶
Los documentos denominados como «bien formados» (del inglés well formed) son aquellos que cumplen con todas las definiciones básicas de formato y pueden, por lo tanto, analizarse correctamente por cualquier analizador sintáctico (parser) que cumpla con la norma. Esto significa que debe aplicarse a las siguientes condiciones:
- Cada etiqueta de apertura tiene una etiqueta de cierre.
- Todas las etiquetas están completamente anidadas.
- Los documentos XML solamente permiten un elemento raíz del que todos los demás sean parte, es decir, solo pueden tener un elemento inicial.
- El XML es sensible a mayúsculas y minúsculas.
Partes de un documento XML¶
Prólogo¶
Aunque no es obligatorio, los documentos XML pueden empezar con unas líneas que describen la versión XML, el tipo de documento y otras cosas.
El prólogo de un documento XML contiene:
- Una declaración XML. Es la sentencia que declara al documento como un documento XML.
- Una declaración de tipo de documento. Enlaza el documento con su DTD (definición de tipo de documento), o el DTD puede estar incluido en la propia declaración o ambas cosas al mismo tiempo.
- Uno o más comentarios e instrucciones de procesamiento. Ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
Cuerpo¶
A diferencia del prólogo, el cuerpo no es opcional en un documento XML, el cuerpo debe contener solo un elemento raíz, característica indispensable también para que el documento esté bien formado. Sin embargo es necesaria la adquisición de datos para su buen funcionamiento.
Elementos¶
Los elementos XML pueden tener contenido (más elementos, caracteres o ambos), o bien ser elementos vacíos.
Atributos¶
Los elementos pueden tener atributos, que son una manera de incorporar características o propiedades a los elementos de un documento. Deben ir entre comillas.
<person sex="male">
<firstname>Luffy</firstname>
<lastname>D. Monkey</lastname>
</person>
person
tiene un atributo sex
.
Comentarios¶
Comentarios a modo informativo para el programador que han de ser ignorados por el procesador. Los comentarios en XML tienen el siguiente formato:
<!-- Comment -->
Java XML¶
Java permite usar analizadores XMLpara leer y escribir documentos XML; Además, JAXB para convertir XML a/desde objetos. En general, existen dos modelos para trabajar con documentos XML: DOM y SAX.
DOM¶
El modelo de objeto de documento (DOM) utiliza nodos para representar los documentos XML completos como una estructura de árbol y almacenarlos en la memoria. DOM es bueno para manipular el archivo XML pequeño, como leer, escribir y modificar la estructura XML; DOM NO es para analizar o manipular archivos XML grandes porque construir la estructura XML completa en la memoria consume mucha memoria.
SAX¶
La API simple para XML (SAX) permite leer el archivo XML de principio a fin, es decir, de manera secuencial.
El SAX es rápido y eficiente, requiere mucha menos memoria que DOM porque SAX no crea una representación interna (estructura de árbol) de los datos XML, como lo hace un DOM.
StAX¶
Streaming API for XML (StAX) está basado en eventos, permite leer y escribir documentos XML. StAX ofrece un modelo de programación más simple que SAX y una gestión de memoria más eficiente que DOM.
Ejemplos con InputStream y OutputStream¶
private static Document loadXMLDocument(String url) {
try (InputStream input = new URL(url).openStream()) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(input);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void writeXml(Document doc, OutputStream output) throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(output);
transformer.transform(source, result);
}
JSON¶
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos. Es un fichero fácil de leer y escribir para los humanos y también fácil de analizar y generar para las máquinas. Se basa en un subconjunto del lenguaje de programación JavaScript. Debido a su amplia adopción como alternativa a XML. JSON es un formato de texto que es completamente independiente del lenguaje pero utiliza convenciones que son ampliamente conocidos por los programadores de la familia de lenguajes C, incluyendo C, C++, C#, Java, JavaScript, Perl, Python, y muchos otros. Estas propiedades hacen que JSON sea un lenguaje ideal para el intercambio de datos.
JSON se basa en dos estructuras que son universales; virtualmente todos los lenguajes de programación las soportan de una forma u otra:
- Una colección de pares de name/value. En varios lenguajes, esto se realiza como un objeto, registro, estructura, diccionario, tabla hash, lista con clave o matriz asociativa.
- Una lista ordenada de valores. En la mayoría de los lenguajes, esto se realiza como una matriz, vector, lista o secuencia.
Tipos de datos disponibles¶
- Números: Se permiten números negativos y opcionalmente pueden contener parte decimal separada por puntos. Ejemplo: 123.456
- Cadenas: Representan secuencias de cero o más caracteres. Se ponen entre doble comillas y se permiten cadenas de escape. Ejemplo: "Hola"
- Booleanos: Representan valores booleanos y pueden tener dos valores: true y false
- null: Representan el valor nulo.
- Array: Representa una lista ordenada de cero o más valores los cuales pueden ser de cualquier tipo. Los valores se separan por comas y el vector se mete entre corchetes.
- Objetos: Son colecciones no ordenadas de pares de la forma
nombre:valor
separados por comas y puestas entre llaves. El nombre tiene que ser una cadena entre comillas dobles. El valor puede ser de cualquier tipo.
Formato JSON¶
- Un objeto es un conjunto desordenado de pares de name/value. Un objeto comienza con
{
(llave izquierda) y termina con}
(llave derecha). Cada nombre va seguido de:
(dos puntos) y los pares de name/value están separados por,
(coma).

- Un array es una colección ordenada de valores. Una matriz comienza con
[
(corchete izquierdo) y termina con]
(corchete derecho). Los valores están separados por,
(coma).

- Un value puede ser una cadena entre comillas dobles, un número, verdadero, falso, nulo, un objeto o una matriz. Estas estructuras se pueden anidar.

Java JSON¶
Java por defecto no ofrece ninguna funcionalidad integrada para analizar o crear JSON, en lugar de eso, tendremos que confiar en una biblioteca/paquete de terceros. En la actualidad existen varias librerías para pasar transformar un objeto Java en una cadena JSON (serialización) o viceversa (deserialización).
Desde la página en donde se encuentra la especificación de JSON se indican las librerías más conocidas para tratar/generar información relativa al formato JSON en los diferentes lenguajes de programación. Vamos a ver cómo parsear un JSON utilizando el paquete org.json. Los archivos en este paquete implementan codificadores/decodificadores JSON en Java.
// Este método accede a una URL y descarga el contenido en forma de String
public static String stream(String url) {
try (InputStream input = new URL(url).openStream()) {
InputStreamReader isr = new InputStreamReader(input);
BufferedReader reader = new BufferedReader(isr);
StringBuilder json = new StringBuilder();
int c;
while ((c = reader.read()) != -1) {
json.append((char) c);
}
return json.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
String caturl = "https://catfact.ninja/facts";
// Parseamos un string a un JSONObject
JSONObject jsonObject = new JSONObject(stream(caturl));
JSONArray a = jsonObject.getJSONArray("data");
JSONObject o = (JSONObject) a.get(0);
System.out.println(o.getString("fact"));
}
Un JSONObject
es una colección desordenada de pares clave y valor, que se asemeja a las implementaciones Map nativas de Java.
Bases de datos¶
Una base de datos es una herramienta que recopila datos, los organiza y los relaciona para que se pueda hacer una rápida búsqueda y recuperar con ayuda de un ordenador. Hoy en día, las bases de datos también sirven para desarrollar análisis. Las bases de datos más modernas tienen motores específicos para sacar informes de datos complejos.
Además, es importante saber que hay varios tipos de base de datos: la relacional; la distribuida; NoSQL; orientada a objetos; y, gráficas. La existencia de estas diversas bases de datos se debe a la variedad de forma de trabajo que se requiere de ellas.
Las bases de datos relacionales representan la información en forma de tablas, con filas y columnas que se relacionan mediante campos clave. Además se trabaja con el lenguaje estándar conocido como SQL, para poder realizar las consultas que deseemos a la base de datos.
El sistema gestor de bases de datos, en inglés conocido como: Database Management System (DBMS), gestiona el modo en que los datos se almacenan, mantienen y recuperan. En el caso de una base de datos relacional, el sistema gestor de base de datos se denomina: Relational Database Management System (RDBMS).