2011-02-02 9 views
12

decir que tengo el siguiente archivo YAML:Invalidar subclave YAML

- 
    key1: value 
# and so on... 
    key99: value 
    key100: 
     subkey1: value 
# and so on... 
     subkey100: value 
- 
    key1: value 
# and so on... 
    key99: value 
    key100: 
     subkey1: value 
# and so on... 
     subkey100: SOME DIFFERENT VALUE 

La forma natural de manejar una gran cantidad de datos idénticos sería con las anclas, y reemplazando simplemente la tecla que ha cambiado.

La pregunta es, aquí, una subclave es diferente. ¿Hay alguna manera fácil de simplemente hacer referencia a que key100['subkey100'] ha cambiado? ¿O debo usar una serie de anclas en cada nivel?

es decir, no es una abreviatura para:

- &anchor 
    key1: value 
# and so on... 
    key99: value 
    key100: &subanchor 
     subkey1: value 
# and so on... 
     subkey100: value 
- 
    <<: *anchor 
    key100: 
     <<: *subanchor 
     subkey100: SOME DIFFERENT VALUE 
+0

¡Esto debería ser un problema fácil! ¡Gente Cmon! – Thomas

Respuesta

7

Si he entendido bien la pregunta, no creo que la especificación es compatible con los elementos primordiales de nodos anclados.

En la lectura de la spec (versión 1.2, pero 1.1 dice lo mismo), la sección 7.1 Alias Nodes estados (énfasis mío):

ocurrencias subsiguientes de un nodo previamente serializado se presentan como nodos de alias. La primera aparición del nodo debe estar marcada por un anclaje para permitir que las siguientes ocurrencias se presenten como nodos de alias.

Un nodo de alias se denota con el indicador "*". El alias se refiere al nodo precedente más reciente que tiene el mismo anclaje. Es un error que un nodo de alias use un anclaje que no aparece previamente en el documento. No es un error especificar un ancla que no sea utilizada por ningún nodo de alias.

Tenga en cuenta que un nodo de alias no debe especificar ninguna propiedad o contenido, ya que estos ya se especificaron en la primera aparición del nodo.

dos puntos aquí:

  1. "nodo anteriormente serializado" - este texto sugiere que el alias está destinado a representar otra ocurrencia del nodo original, no sólo los datos en el nodo original. En otras palabras, representa el mismo objeto, no una copia.

  2. Si un alias no puede tener ningún contenido (segunda sección en negrita), no puede especificar la anulación de la manera sugerida en la pregunta.

Así que mi interpretación de la especificación es que no se puede hacer de acuerdo con la especificación.

Sin embargo, si pega el ejemplo (segundo bloque de código) del original en this online tool (es posible que desee desmarcar 'canónico'), esa herramienta lo interpreta como está previsto en la pregunta, copiando el contenido original pero reemplazando subkey100. Lo mismo para este YAML Lint Tool, al igual que this online parser.

Parece que funciona en la práctica, pero no puedo encontrar soporte para ella dentro de la especificación.