YAML ( / ˈjæməl / ; ver § Historia y nombre) es unlenguaje de serialización de datoslegible por humanos . Se utiliza comúnmente paraarchivos de configuracióny en aplicaciones donde se almacenan o transmiten datos. YAML se dirige a muchas de las mismas aplicaciones de comunicaciones queel lenguaje de marcado extensible(XML), pero tiene una sintaxis mínima que difiere intencionalmente dellenguaje de marcado generalizado estándar(SGML).[3]Utilizade Pythonpara indicar anidamiento[3]y no requiere comillas alrededor de la mayoría de los valores de cadena (también admiteel estiloJSONymixto en el mismo archivo).[4][...]
{...}
Se permiten tipos de datos personalizados, pero YAML codifica de forma nativa escalares (como cadenas , enteros y flotantes ), listas y matrices asociativas (también conocidas como mapas, diccionarios o hashes). Estos tipos de datos se basan en el lenguaje de programación Perl , aunque todos los lenguajes de programación de alto nivel de uso común comparten conceptos muy similares. [5] [6] [7] La sintaxis centrada en dos puntos, utilizada para expresar pares clave-valor , está inspirada en los encabezados de correo electrónico tal como se define en RFC 822, y el separador de documentos ---
se toma prestado de MIME ( RFC 2046). Las secuencias de escape se reutilizan de C , y el ajuste de espacios en blanco para cadenas de varias líneas está inspirado en HTML . Las listas y los hashes pueden contener listas y hashes anidados, formando una estructura de árbol ; los gráficos arbitrarios se pueden representar utilizando alias YAML (similares a XML en SOAP ). [3] YAML está pensado para ser leído y escrito en secuencias, una característica inspirada en SAX . [3]
El soporte para leer y escribir YAML está disponible para muchos lenguajes de programación. [8] Algunos editores de código fuente como Vim , [9] Emacs , [10] y varios entornos de desarrollo integrados [11] [12] [13] tienen características que facilitan la edición de YAML, como plegar estructuras anidadas o resaltar automáticamente errores de sintaxis.
La extensión de nombre de archivo recomendada oficialmente para los archivos YAML ha sido .yaml
desde 2006. [14] En 2024, se habrá finalizado el tipo MIME . [1]application/yaml
YAML ( / ˈ j æ m əl / , rima con camel [4] ) fue propuesto por primera vez por Clark Evans en 2001, [15] quien lo diseñó junto con Ingy döt Net [16] y Oren Ben-Kiki. [16] Originalmente se decía que YAML significaba Yet Another Markup Language , [17] porque fue lanzado en una era que vio una proliferación de lenguajes de marcado para presentación y conectividad (HTML, XML, SGML, etc.). Su nombre inicial fue pensado como una referencia irónica [18] al panorama tecnológico, haciendo referencia a su propósito como lenguaje de marcado con el constructo yet another , pero luego fue reutilizado como YAML Ain't Markup Language , un acrónimo recursivo , para distinguir su propósito como orientado a datos, en lugar de marcado de documentos.
Una hoja de trucos y especificaciones completas están disponibles en el sitio oficial. [19] La siguiente es una sinopsis de los elementos básicos.
YAML acepta todo el conjunto de caracteres Unicode, excepto algunos caracteres de control , y puede codificarse en cualquiera de los formatos UTF-8 , UTF-16 o UTF-32 . (Aunque UTF-32 no es obligatorio, es necesario para que un analizador tenga compatibilidad con JSON ). [20]
#
), pueden comenzar en cualquier parte de una línea y continuar hasta el final de la línea. Los comentarios deben estar separados de otros tokens por caracteres de espacio en blanco. [22] Si aparecen caracteres # dentro de una cadena, entonces son #
literales con el signo de número ( ).-
) con un miembro por línea.[...]
) con cada entrada separada por una coma .http://www.wikipedia.org
puedan representarse sin necesidad de estar entre comillas.{...}
), con claves separadas de valores por dos puntos y las entradas separadas por comas (no se requieren espacios para mantener la compatibilidad con JSON)."
) o comillas simples ( '
).\
). Según la documentación, el único escape octal admitido es \0
.''
) que denota la comilla simple en sí, como en 'don''t'
.|
) o doblar ( >
) las nuevas líneas.---
)....
) finalizan opcionalmente un documento dentro de una secuencia.&
) y luego se referencian con un asterisco ( *
).!!
) seguido de una cadena, que puede expandirse a una URI.%
) seguido de un nombre y parámetros delimitados por espacios. En YAML 1.1 se definen dos directivas:El formato de bloque convencional utiliza un guión + espacio para comenzar un nuevo elemento en la lista.
--- # Películas favoritas - Casablanca - Con la muerte en los talones - El hombre que nunca estuvo allí
El formato en línea opcional está delimitado por coma+espacio y encerrado entre corchetes (similar a JSON ). [23]
--- # Lista de compras [ leche , pastel de calabaza , huevos , jugo ]
Las claves se separan de los valores mediante dos puntos y un espacio. Los bloques con sangría, habituales en los archivos de datos YAML, utilizan sangría y nuevas líneas para separar los pares clave/valor. Los bloques en línea, habituales en los flujos de datos YAML, utilizan coma y espacio para separar los pares clave/valor entre llaves.
--- # Bloque sangrado nombre : John Smith edad : 33 --- # Bloque en línea { nombre : John Smith , edad : 33 }
Las cadenas no requieren comillas. Hay dos formas de escribir cadenas de varias líneas: una que conserva los saltos de línea (utilizando el |
carácter ) y otra que los pliega (utilizando el >
carácter ), ambas seguidas de un carácter de salto de línea.
datos : | Había una vez un hombre alto de Ealing que se subió a un autobús a Darjeeling. En la puerta decía : "Por favor, no te sientes en el suelo". Así que se sentó con cuidado en el techo.
De forma predeterminada, se eliminan la sangría inicial (de la primera línea) y los espacios finales, aunque se puede especificar explícitamente otro comportamiento.
datos : > El texto ajustado se plegará en un solo párrafo Las líneas en blanco indican saltos de párrafo.
El texto plegado convierte las nuevas líneas en espacios y elimina los espacios iniciales.
--- # The Smiths - { nombre : John Smith , edad : 33 } - nombre : Mary Smith edad : 27 - [ nombre , edad ]: [ Rae Smith , 4 ] # Se admiten secuencias como claves --- # Personas, por género hombres : [ John Smith , Bill Jones ] mujeres : - Mary Smith - Susan Williams
Los objetos y las listas son componentes importantes en yaml y se pueden combinar. El primer ejemplo es una lista de objetos clave-valor, todas las personas de la familia Smith. El segundo los enumera por género; es un objeto clave-valor que contiene dos listas.
Dos características que distinguen a YAML de las capacidades de otros lenguajes de serialización de datos son las estructuras [24] y la tipificación de datos.
Las estructuras YAML permiten el almacenamiento de múltiples documentos dentro de un solo archivo, el uso de referencias para nodos repetidos y el uso de nodos arbitrarios como claves. [24]
Para mayor claridad, compacidad y para evitar errores de ingreso de datos, YAML proporciona anclas de nodo (usando &
) y referencias (usando *
). Las referencias a las anclas funcionan para todos los tipos de datos (vea la referencia de envío en el ejemplo a continuación).
A continuación se muestra un ejemplo de una cola en un secuenciador de instrumentos en el que se hace referencia a dos pasos sin describirlos completamente.
--- # Protocolos de secuenciador para cirugía láser ocular - paso : &id001 # define etiqueta de ancla &id001 instrumento : Lasik 2000 energía del pulso : 5,4 duración del pulso : 12 repetición : 1000 tamaño del punto : 1 mm - paso : &id002 instrumento : Lasik 2000 energía del pulso : 5.0 duración del pulso : 10 repetición : 500 tamaño del punto : 2 mm - Instrumento1 : *id001 # se refiere al primer paso (con ancla &id001) - Instrumento2 : *id002 # se refiere al segundo paso
En la mayoría de los documentos YAML rara vez se observa una tipificación explícita de datos, ya que YAML detecta automáticamente los tipos simples. Los tipos de datos se pueden dividir en tres categorías: básicos, definidos y definidos por el usuario. Los básicos son los que se espera que existan en cualquier analizador (por ejemplo, flotantes, enteros, cadenas, listas, mapas, etc.). Muchos tipos de datos más avanzados, como los datos binarios, se definen en la especificación YAML, pero no se admiten en todas las implementaciones. Por último, YAML define una forma de ampliar las definiciones de tipos de datos localmente para dar cabida a clases, estructuras o primitivas definidas por el usuario (por ejemplo, flotantes de precisión cuádruple).
YAML detecta automáticamente el tipo de datos de la entidad, pero a veces se desea convertir el tipo de datos explícitamente. La situación más común es cuando una cadena de una sola palabra que parece un número, un valor booleano o una etiqueta requiere desambiguación rodeándola con comillas o usando una etiqueta de tipo de datos explícita.
--- a : 123 # un entero b : "123" # una cadena, desambiguada por comillas c : 123.0 # un float d : !!float 123 # también un float a través del tipo de datos explícito prefijado por (!!) e : !!str 123 # una cadena, desambiguada por el tipo explícito f : !!str Sí # una cadena a través del tipo explícito g : Sí # un Boolean True (yaml1.1), cadena "Yes" (yaml1.2) h : Sí, no tenemos bananas # una cadena, "Yes" y "No" desambiguadas por el contexto.
No todas las implementaciones de YAML tienen todos los tipos de datos definidos por la especificación. Estos tipos integrados utilizan un prefijo de signo de!!
exclamación doble ( ). Los tipos particularmente interesantes que no se muestran aquí son los conjuntos, los mapas ordenados, las marcas de tiempo y los hexadecimales. Aquí hay un ejemplo de datos binarios codificados en base64 .
--- imagen : !!binario | R0lGODdhDQAIAIAAAAAAANn Z2SwAAAAADQAIAAACF4SDGQ ar3xxbJ9p0qa7R0YxwzaFME 1IAADs=
Muchas implementaciones de YAML pueden admitir tipos de datos definidos por el usuario para la serialización de objetos. Los tipos de datos locales no son tipos de datos universales, sino que se definen en la aplicación mediante la biblioteca de análisis YAML. Los tipos de datos locales utilizan un solo signo de exclamación ( !
).
La jerarquía de la estructura de datos se mantiene mediante sangría de contorno.
--- recibo : Factura de compra de Oz-Ware Fecha : 2012-08-06 Cliente : nombre : Dorothy apellido : Gale Artículos : - N.º de pieza : A4786 Descripción : Cubo de agua (lleno) Precio : 1,47 Cantidad : 4 - part_no : E1628 descrip : Zapatillas de tacón alto "Ruby" talla : 8 precio : 133.7 cantidad : 1 factura a : &id001 calle : | 123 Tornado Alley Suite 16 ciudad : East Centerville estado : KS enviar a : *id001 Entrega especial : > Sigue el camino de baldosas amarillas hasta la Ciudad Esmeralda. No hagas caso al hombre que está detrás de la cortina. ...
Tenga en cuenta que las cadenas no requieren estar entre comillas. El número específico de espacios en la sangría no es importante siempre que los elementos paralelos tengan la misma justificación a la izquierda y los elementos anidados jerárquicamente estén más sangrados. Este documento de muestra define una matriz asociativa con 7 claves de nivel superior: una de las claves, "items", contiene una lista de 2 elementos, cada elemento de los cuales es en sí mismo una matriz asociativa con claves diferentes. Se muestran los datos relacionales y la eliminación de redundancia: el contenido de la matriz asociativa "ship-to" se copia del contenido de la matriz asociativa "bill-to" como lo indican las etiquetas de ancla ( &
) y referencia ( *
). Se pueden agregar líneas en blanco opcionales para facilitar la lectura. Pueden existir múltiples documentos en un solo archivo/flujo y están separados por ---
. Se puede usar un opcional ...
al final de un archivo (útil para señalar un final en comunicaciones transmitidas sin cerrar la tubería).
Debido a que YAML se basa principalmente en la sangría de contorno para la estructura, es especialmente resistente a la colisión de delimitadores . La insensibilidad de YAML a las comillas y llaves en valores escalares significa que uno puede incrustar documentos XML, JSON o incluso YAML dentro de un documento YAML simplemente sangrándolo en un literal de bloque (usando |
o >
):
--- ejemplo : > HTML entra en YAML sin mensaje de modificación : | <blockquote style="font: italic 1em serif"> <p>"Tres siempre es mayor que dos, incluso para valores grandes de dos"</p> <p>--Autor desconocido</p> </blockquote> fecha : 2007-06-01
YAML se puede colocar en JSON entre comillas y escapando todas las comillas internas. YAML se puede colocar en XML escapando caracteres reservados ( <
, >
, &
, '
, "
) y convirtiendo espacios en blanco, o colocándolo en una sección CDATA .
A diferencia de JSON, que solo puede representar datos en un modelo jerárquico en el que cada nodo secundario tiene un único padre, YAML también ofrece un esquema relacional simple que permite hacer referencia a repeticiones de datos idénticos desde dos o más puntos del árbol en lugar de ingresarlos de manera redundante en esos puntos. Esto es similar a la función IDREF incorporada en XML. [25] El analizador YAML luego expande estas referencias en las estructuras de datos completamente pobladas que implican cuando se leen, por lo que cualquier programa que use el analizador no tiene que ser consciente de un modelo de codificación relacional, a diferencia de los procesadores XML, que no expanden referencias. Esta expansión puede mejorar la legibilidad al tiempo que reduce los errores de ingreso de datos en archivos de configuración o protocolos de procesamiento donde muchos parámetros permanecen iguales en una serie secuencial de registros mientras que solo varían unos pocos. Un ejemplo es que los registros "enviar a" y "facturar a" en una factura son casi siempre los mismos datos.
YAML está orientado a líneas y, por lo tanto, suele ser sencillo convertir la salida no estructurada de programas existentes al formato YAML, manteniendo gran parte del aspecto del documento original. Como no hay etiquetas de cierre, llaves ni comillas que equilibrar, suele ser fácil generar YAML bien formado directamente a partir de instrucciones de impresión distribuidas dentro de programas poco sofisticados. Del mismo modo, los delimitadores de espacios en blanco facilitan el filtrado rápido y sucio de archivos YAML mediante los comandos orientados a líneas de grep, AWK, Perl, Ruby y Python.
En particular, a diferencia de los lenguajes de marcado, los fragmentos de líneas YAML consecutivas tienden a ser documentos YAML bien formados en sí mismos. Esto hace que sea muy fácil escribir analizadores que no tengan que procesar un documento en su totalidad (por ejemplo, equilibrar las etiquetas de apertura y cierre y navegar por los caracteres entrecomillados y escapados) antes de comenzar a extraer registros específicos dentro de él. Esta propiedad es particularmente conveniente cuando se itera en una sola pasada sin estado sobre los registros de un archivo cuya estructura de datos completa es demasiado grande para almacenarla en la memoria, o para el cual reconstruir la estructura completa para extraer un elemento sería prohibitivamente costoso.
Aunque parezca contra-intuitivamente, aunque su delimitación sangrada pueda parecer que complica las jerarquías profundamente anidadas, YAML maneja sangrías tan pequeñas como un solo espacio, y esto puede lograr una mejor compresión que los lenguajes de marcado. Además, la sangría extremadamente profunda se puede evitar por completo ya sea: 1) volviendo al "estilo en línea" (es decir, formato similar a JSON) sin la sangría; o 2) usando anclas relacionales para desenrollar la jerarquía a una forma plana que el analizador YAML reconstituirá de manera transparente en la estructura de datos completa. [26]
YAML es un lenguaje puramente de representación de datos y, por lo tanto, no tiene comandos ejecutables. Si bien la validación y el análisis seguro son inherentemente posibles en cualquier lenguaje de datos, la implementación es una trampa tan notoria que la falta de un lenguaje de comandos asociado en YAML puede ser un beneficio relativo para la seguridad.
Sin embargo, YAML permite etiquetas específicas del lenguaje para que un analizador que admita esas etiquetas pueda crear objetos locales arbitrarios. Cualquier analizador YAML que permita la ejecución de instancias sofisticadas de objetos abre la posibilidad de un ataque de inyección. Los analizadores Perl que permiten la carga de objetos de clases arbitrarias crean los llamados valores "bendecidos". El uso de estos valores puede provocar un comportamiento inesperado, por ejemplo, si la clase utiliza operadores sobrecargados. Esto puede llevar a la ejecución de código Perl arbitrario. [27] [ ¿ Fuente poco fiable? ]
La situación es similar para los analizadores de Python o Ruby. Según la documentación de PyYAML: [28]
Tenga en cuenta que la capacidad de construir un objeto Python arbitrario puede ser peligrosa si recibe un documento YAML de una fuente no confiable, como Internet. La función
yaml.safe_load
limita esta capacidad a objetos Python simples, como números enteros o listas. [...]PyYAML permite construir un objeto Python de cualquier tipo. Incluso se pueden construir instancias de clases Python utilizando la
!!python/object
etiqueta.
La especificación YAML identifica un documento de instancia como una "Presentación" o "flujo de caracteres". [29] Las estructuras lógicas primarias en un documento de instancia YAML son escalares, secuencias y mapeos. [30] La especificación YAML también indica algunas restricciones básicas que se aplican a estas estructuras lógicas primarias. Por ejemplo, según la especificación, las claves de mapeo no tienen un orden. En cada caso donde el orden de los nodos es significativo, se debe utilizar una secuencia. [31]
Además, al definir la conformidad de los procesadores YAML, la especificación YAML define dos operaciones principales: dump y load . Todos los procesadores compatibles con YAML deben proporcionar al menos una de estas operaciones y, opcionalmente, pueden proporcionar ambas. [32] Finalmente, la especificación YAML define un modelo de información o "gráfico de representación", que debe crearse durante el procesamiento tanto para las operaciones de dump como de load , aunque no es necesario que esta representación esté disponible para el usuario a través de una API. [33]
La sintaxis JSON es la base de la versión 1.2 de YAML, que se promulgó con el propósito expreso de hacer que YAML "cumpla con JSON como subconjunto oficial". [4] Aunque las versiones anteriores de YAML no eran estrictamente compatibles, [34] las discrepancias rara vez se notaban y la mayoría de los documentos JSON pueden analizarse con algunos analizadores YAML como Syck. [35] Esto se debe a que la estructura semántica de JSON es equivalente al "estilo en línea" opcional de escritura de YAML. Si bien las jerarquías extendidas se pueden escribir en estilo en línea como JSON, este no es un estilo YAML recomendado excepto cuando ayuda a la claridad.
YAML tiene muchas características adicionales que no están presentes en JSON, incluidos comentarios, tipos de datos extensibles, anclajes relacionales, cadenas sin comillas y tipos de mapeo que preservan el orden de las claves.
Debido a su concisión , la serialización y deserialización de JSON es mucho más rápida que la de YAML. [36] [37]
TOML fue diseñado para ser un avance del formato de archivo .ini . El uso mínimo de caracteres indicadores de YAML se compara favorablemente con el requisito estricto de comillas y corchetes de TOML. [ opinión ] El uso de sangría significativa de YAML se ha contrastado con la notación de puntos de los nombres de clave y tabla de TOML para transmitir la misma estructura semántica. Las opiniones difieren sobre qué convención conduce a archivos de configuración más legibles. [38] [39]
YAML carece de la noción de atributos de etiqueta que se encuentran en XML. En su lugar, YAML tiene declaraciones de tipos extensibles (incluidos los tipos de clase para objetos).
YAML en sí no tiene descriptores de esquema de documento definidos por lenguaje XML que permitan, por ejemplo, que un documento se autovalide. Sin embargo, existen varios lenguajes de descriptores de esquema definidos externamente para YAML (por ejemplo, Doctrine , Kwalify y Rx) que cumplen esa función. Además, la semántica proporcionada por las declaraciones de tipo definidas por lenguaje de YAML en el propio documento YAML con frecuencia relaja la necesidad de un validador en situaciones simples y comunes. Además, YAXML, que representa las estructuras de datos YAML en XML, permite que los importadores de esquemas XML y los mecanismos de salida como XSLT se apliquen a YAML.
La comparación de formatos de serialización de datos proporciona una comparación más completa de YAML con otros formatos de serialización.
Para estructuras de datos fijas, los archivos YAML se pueden generar simplemente utilizando comandos de impresión que escriben tanto los datos como la decoración específica de YAML. Sin embargo, para volcar datos jerárquicos complejos o variables, es preferible un emisor YAML dedicado . De manera similar, los archivos YAML simples (por ejemplo, pares clave-valor) se analizan fácilmente con expresiones regulares. Para estructuras de datos más complejas o variables, se recomienda un analizador YAML formal.
Existen emisores y analizadores YAML para muchos lenguajes populares. La mayoría de ellos están escritos en el lenguaje nativo. Algunos son enlaces de lenguaje de la biblioteca C libyaml ; pueden ejecutarse más rápido. Solía haber otra biblioteca C, llamada Syck , escrita y huérfana por qué la suerte se quedó atrás : no se mantiene, no hay un paquete de código fuente autorizado y el sitio web ha sido secuestrado. Por lo tanto, la única biblioteca C recomendable es libyaml . Fue desarrollada originalmente por Kirill Simonov. En 2018, el desarrollo fue reanudado por los nuevos mantenedores Ian Cordasco e Ingy döt Net. [40]
Los programadores de C++ pueden elegir entre la biblioteca de C libyaml y la biblioteca de C++ libyaml-cpp . Ambas tienen bases de código completamente independientes y API completamente diferentes . La biblioteca libyaml-cpp todavía tiene un número de versión principal de 0, lo que indica que la API puede cambiar en cualquier momento, como sucedió de hecho después de la versión 0.3. Hay una implementación centrada en la gramática escrita en C#, con el objetivo de extensiones para los elementos anidados. [41]
Algunas implementaciones de YAML, como YAML.pm de Perl, cargarán un archivo completo (stream) y lo analizarán en masa . Otras implementaciones como PyYaml son perezosas y solo iterarán sobre el siguiente documento cuando se lo soliciten. Para archivos muy grandes en los que se planea manejar los documentos de forma independiente, instanciar el archivo completo antes del procesamiento puede resultar prohibitivo. Por lo tanto, en YAML.pm, ocasionalmente uno debe dividir un archivo en documentos y analizarlos individualmente. YAML facilita esto, ya que simplemente requiere dividir en el marcador de fin de documento, que se define como tres puntos al comienzo de una línea seguidos de un espacio en blanco (y posiblemente un comentario). Este marcador está prohibido en el contenido. [42]
YAML ha sido criticado por sus importantes espacios en blanco , características confusas, valores predeterminados inseguros y su especificación compleja y ambigua: [43] [44] [45]
Yes
y No
se convierten en booleanos; los números de versión de software pueden convertirse en números de punto flotante. [43] [46]Las fallas percibidas y la complejidad de YAML han llevado al surgimiento de alternativas más estrictas como StrictYAML y NestedText. [46]
/*...*/
los comentarios de Javascript. El manejo de tales casos extremos puede requerir un preprocesamiento ligero de JSON antes de analizarlo como YAML en línea. Véase también [1] Archivado el 29 de agosto de 2013 en Wayback Machine .